كيف يمكنني تعيين عنوان مؤشر تعليمات Segfault من/var/log/message إلى عنوان/وظيفة في ملف .map الخاص بي؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

(بيئتي هي 64 بت من Ubuntu ، طلبي هو C ++ تجميع وربط مع G ++.)

عندما يقوم التطبيق بشيء مثل الفجوة على الصفر أو تشغيل أ asm("int $3") غادر في الكود ، يتم تسجيل تسجيل واحد مما يلي عبر syslog إلى /var/log/kern.log و /var/log/messages:

Sep 10 18:06:47 VM kernel: [117194.123452] a.out[20288] trap divide error ip:45c59d sp:7fff65a91810 error:0 in a.out[400000+144000]
Sep 10 18:07:10 VM kernel: [117217.020833] a.out[20294] trap int3 ip:45c493 sp:7fff5cc559f0 error:0

في كلتا الحالتين ، يشير عنوان مؤشر التعليم إلى شيء يمكنني البحث عنه بسهولة في .map ملف المنتج في وقت الرابط (باستخدام ""-Wl,-Map,output.map").

ولكن إذا تسببت في خطأ SEG ، في هذه الحالة عن طريق دعوة إلى memcpy() مع تعيين المصدر إلى NULL ، يكون مؤشر التعليمات خارج النطاق ، ليس لدي أي فكرة عن كيفية تعيينه:

Sep 10 18:06:13 VM kernel: [117160.228587] a.out[20282]: segfault at 0 ip 00007f7e79209092 sp 00007fff831faf08 error 4 in libc-2.9.so[7f7e79185000+168000]

في هذا المثال ، كنت أتوقع أن يكون IP في نطاق 0x445E70-0X445E7F ، وهو موقع memcpy () وفقًا لملف .map الخاص بي.

سؤالي: ما هي الحيلة لتفسير IP في هذه الحالة؟

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

المحلول

وفقًا للرسالة التي يبدو أنها تحطمت في الداخل memcpy(), ، من libc-2.9.so, ، والتي يتم تعيينها في عمليتك تبدأ من 0x7F7E79185000. هذا متوقع منذ ذلك الحين memcpy هي الوظيفة التي تحاول إشراف المؤشر. يبدو مؤشر التعليمات صالحًا لأنه يقع في نطاق LIBC. إذا كنت تعتزم تجاوز memcpy والاتصال بإصدارك الخاص ، فقد تحتاج إلى تجميعها -fno-builtin-memcpy.

يحرر: قد تقوم بربط LIBC بشكل ثابت ولكن وفقًا للرسالة ، لديك أيضًا مكتبة LIBC المشتركة المعينة في ذاكرة العملية الخاصة بك. يجب أن تراه مدرجًا في /proc/بيد/maps أثناء تشغيل برنامجك. قد تكون أنك تربط مكتبة مشتركة أخرى ، مثل LiBSTDC ++ ، وتعتمد على مكتبة Libc المشتركة. نتيجةً لذلك ، لديك نسختان من Memcpy ، وفي هذه الحالة ، يطلق على إصدار Libc Shared Library الذي تم تعيينه على العنوان العالي. إذا كنت لا تريد مكتبة Libc المشتركة ، فتأكد من ربطك الكل المكتبات بشكل ثابت ؛ استخدم ال -static الخيار في بداية خط الرابط الخاص بك.

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