objdump d'un fichier .so? besoin d'aide pour comprendre les messages
-
25-09-2019 - |
Question
Je développe une application native en rapport avec le streaming, je suis confronté à des problèmes dans mon module c ... et ce que j'ai un certain message de Logcat
Voici le message 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
est la ligne qui représente la classe c qui utilise i.
selon les commentaires sur mon question précédente i suivi url donnée par Rahul et jetai mon fichier .so dans un fichier texte.
Voici ce fichier texte
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
selon le poste dans google groupes et spécialement suggéré par Nicklas Ansman i avait montré l'extrait qui est autour de ma ligne désirée 142e
.
Maintenant, quelqu'un peut-il ici qui peut dire ce que des moyens 47b0 blx r6
?
Qu'est-ce que je savais est-il quelque chose d'écrit en langage assembleur que je ne sais pas. Alors j'ai besoin de votre aide pour comprendre cette ligne.
Merci d'avance
La solution
blx
saute à l'adresse indiquée par l'argument; ici, à l'adresse qui est actuellement chargé dans r6 registre. En outre, l'adresse de retour (à savoir l'adresse de l'opcode ldr
qui est situé immédiatement après la blx
) est écrit dans le registre à usage spécial lr (comme « registre de liaison »).
Cela correspond à un appel indirect. En C, il ressemblerait à un appel via un pointeur de fonction. sur certaines plates-formes avec liens dynamiques, un simple appel de fonction à une fonction peut aussi devenir quelque chose comme ce que vous voyez ici.
Quoi qu'il en soit, la décharge de registre montre r6 à 0 à ce moment-là, d'où le segfault. r6 a été chargé de l'opcode ldr
sur l'adresse 1424. Cette charge r6 de ce qui était à l'adresse r0 + r1, r1 étant réglé sur 132 juste au-dessus. r0 est le registre classique pour le premier argument d'une fonction C.
Autres conseils
Ok trouver avec quelques recherches sur google monstre.
blx
signifie Branch and link with exchange (BLX)
et si je ne me trompe pas, il est semblable à return withValue
type d'instruction java.
il m'a aidé à démarrer le débogage dans le code natif aussi ......