objdump de um arquivo .so? Precisa de ajuda para entender as mensagens
-
25-09-2019 - |
Pergunta
Estou desenvolvendo um aplicativo nativo relacionado ao streaming, estou enfrentando alguns problemas no meu módulo C ... e o que tenho é alguma mensagem do Logcat
Aqui está a mensagem logcat
INFO/DEBUG(28): Build fingerprint: 'generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/test-keys'
11-17 12:40:07.550: INFO/DEBUG(28): pid: 5957, tid: 5957 >>> com.mmstwo <<<
11-17 12:40:07.561: INFO/DEBUG(28): signal 11 (SIGSEGV), fault addr deadd00d
11-17 12:40:07.561: INFO/DEBUG(28): r0 00000354 r1 00129100 r2 0000000c r3 deadd00d
11-17 12:40:07.561: INFO/DEBUG(28): r4 00000026 r5 ad07ff50 r6 00000000 r7 fffe72f8
11-17 12:40:07.579: INFO/DEBUG(28): r8 afe3bdfc r9 4509f020 10 00000000 fp 00135a40
11-17 12:40:07.590: INFO/DEBUG(28): ip ad080160 sp bef28f90 lr afe14cf7 pc ad035452 cpsr 20000030
11-17 12:40:07.840: INFO/DEBUG(28): #00 pc 00035452 /system/lib/libdvm.so
11-17 12:40:07.850: INFO/DEBUG(28): #01 pc 00027a98 /system/lib/libdvm.so
11-17 12:40:07.869: INFO/DEBUG(28): #02 pc 00027bba /system/lib/libdvm.so
11-17 12:40:07.879: INFO/DEBUG(28): #03 pc 0002d98e /system/lib/libdvm.so
11-17 12:40:07.901: INFO/DEBUG(28): #04 pc 0000142e /data/data/com.mmstwo/lib/libnstreamer.so
Esta é a linha que representa a classe C que eu uso.
Conforme comentários sobre Minha pergunta anterior Eu segui o URL fornecido por Rahul e despejei meu arquivo .So em um arquivo de texto.
Aqui está esse arquivo de texto
141e: 4a2d ldr r2, [pc, #180] (14d4 <Java_com_mmstwo_NativeParser_stringFromJNI+0x408>)
1420: 4b2d ldr r3, [pc, #180] (14d8 <Java_com_mmstwo_NativeParser_stringFromJNI+0x40c>)
1422: 2184 movs r1, #132
1424: 5846 ldr r6, [r0, r1]
1426: 18aa adds r2, r5, r2
1428: 18eb adds r3, r5, r3
142a: 4651 mov r1, sl
142c: 1c38 adds r0, r7, #0
142e: 47b0 blx r6
1430: 4b2a ldr r3, [pc, #168] (14dc <Java_com_mmstwo_NativeParser_stringFromJNI+0x410>)
1432: 4669 mov r1, sp
Então, de acordo com o Postagem no Google Grupos e especialmente sugerido por Nicklas Ansman, eu havia mostrado o trecho que está em torno da minha linha desejada 142e
.
Agora qualquer pessoa aqui pode dizer o que faz 47b0 blx r6
significa?
O que eu sabia é que é algo escrito na linguagem de montagem que eu não conheço. Então, preciso da sua ajuda para entender essa linha.
desde já, obrigado
Solução
blx
salta para o endereço dado pelo argumento; Aqui, para o endereço que está atualmente carregado no Registro R6. Além disso, o endereço de retorno (a saber, o endereço do ldr
opcode que está localizado imediatamente após o blx
) está escrito no registro de fins especiais LR (como "Link Register").
Isso corresponde a uma chamada indireta. Em C, seria uma chamada através de um ponteiro de função. Em algumas plataformas com vinculação dinâmica, uma simples chamada de função para uma função também pode se tornar algo como o que você vê aqui.
De qualquer forma, o despejo do registro mostra R6 como 0 nesse ponto, daí o segfault. R6 foi carregado do ldr
Opcode no endereço 1424. Isso carrega R6 do que estava no endereço R0+R1, R1 sendo definido como 132 logo acima. R0 é o registro convencional para o primeiro argumento para uma função C.
Outras dicas
Ok, descubra com algumas escavações estranhas no Google. '
blx
significa Branch and link with exchange (BLX)
E se eu não estou errado, é semelhante a return withValue
Tipo de declaração Java.
Isso me ajudou a começar a depurar o código nativo também ......