objdump من ملف. لذا؟ بحاجة إلى مساعدة لفهم الرسائل

StackOverflow https://stackoverflow.com/questions/4202670

  •  25-09-2019
  •  | 
  •  

سؤال

أقوم بتطوير تطبيق أصلي يتعلق بالتدفق ، أواجه بعض المشكلات في وحدة 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 وألقيت ملف. لذا إلى ملف نصي.

هذا هو هذا الملف النصي

 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

حتى حسب النشر في مجموعات جوجل واقترحه خصيصًا من قبل Nicklas Ansman لقد أظهرت المقتطف الذي يقع حول خطي المطلوب 142e.

الآن يمكن لأي شخص هنا أن يقول ماذا يفعل 47b0 blx r6 يعني؟

ما أعرفه هو شيء مكتوب بلغة التجميع لا أعرفه. لذلك أحتاج إلى مساعدتكم في فهم هذا الخط.

شكرا لك مقدما

هل كانت مفيدة؟

المحلول

blx يقفز إلى العنوان الذي قدمته الوسيطة ؛ هنا ، على العنوان الذي يتم تحميله حاليًا في السجل R6. أيضا ، عنوان الإرجاع (أي عنوان ldr Opcode الذي يقع مباشرة بعد blx) مكتوب في سجل الأغراض الخاصة LR (كـ "سجل الارتباط").

هذا يتوافق مع مكالمة غير مباشرة. في C سيبدو وكأنه مكالمة من خلال مؤشر وظيفة. على بعض المنصات ذات الارتباط الديناميكي ، يمكن أن تصبح دعوة وظيفة بسيطة إلى وظيفة ما مثل ما تراه هنا.

على أي حال ، يُظهر تفريغ التسجيل R6 ليكون 0 في تلك المرحلة ، وبالتالي Segfault. تم تحميل R6 من ldr OPCODE على العنوان 1424. هذا يحمل R6 من ما كان في العنوان R0+R1 ، يتم تعيين R1 على 132 أعلى بقليل. R0 هو السجل التقليدي للوسيطة الأولى لوظيفة C.

نصائح أخرى

حسنًا ، اكتشفها مع بعض الحفر المذهل على Google.

blx تعني Branch and link with exchange (BLX) وإذا لم أكن مخطئًا ، فهذا يشبه return withValue نوع بيان جافا.

لقد ساعدني ذلك على بدء تصحيح الأخطاء في الكود الأصلي أيضًا ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top