objdump .so файла?нужна помощь, чтобы понять сообщения - PullRequest
5 голосов
/ 17 ноября 2010

Я занимаюсь разработкой собственного приложения, связанного с потоковой передачей, у меня возникают некоторые проблемы с модулем c ... и у меня есть какое-то сообщение от Logcat


Вот сообщение 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

это строка, представляющая класс c, который я использую.


согласно комментариям к мой предыдущий вопрос я следовалURL-адрес, предоставленный rahul и выгрузивший мой .so-файл в текстовый файл.

вот этот текстовый файл

 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

, согласно сообщению в группах Google испециально предложенный Никласом Ансманом, я показал фрагмент, который находится вокруг моей желаемой строки 142e.

Теперь может кто-нибудь здесь, кто может сказать, что означает 47b0 blx r6?

То, что я знал, это то, что написано на ассемблере, чего я не знаю.Поэтому мне нужна ваша помощь в понимании этой строки.

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 17 ноября 2010

blx переходит на адрес, заданный аргументом;здесь, по адресу, который в данный момент загружен в регистр r6.Кроме того, обратный адрес (а именно адрес кода операции ldr, который находится сразу после blx) записывается в регистр специального назначения lr (как «регистр связи»).

Это соответствуетна косвенный звонок.В Си это будет выглядеть как вызов через указатель на функцию.на некоторых платформах с динамическим связыванием простой вызов функции может также стать чем-то похожим на то, что вы видите здесь.

В любом случае, дамп регистра показывает, что r6 будет 0 в этой точке, отсюда и ошибка.r6 был загружен из опкода ldr по адресу 1424. Это загружает r6 с того, что было по адресу r0 + r1, при этом r1 устанавливается равным 132 чуть выше.r0 - условный регистр для первого аргумента функции C.

0 голосов
/ 17 ноября 2010

Хорошо, узнай это, покопавшись в гугле. '

blx означает Branch and link with exchange (BLX), и, если я не ошибаюсь, это похоже на return withValue тип заявления java.

это также помогло мне начать отладку в нативном коде ......

...