objdump من ملف. لذا؟ بحاجة إلى مساعدة لفهم الرسائل
-
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
نوع بيان جافا.
لقد ساعدني ذلك على بدء تصحيح الأخطاء في الكود الأصلي أيضًا ...