كيف يمكنني إضافة دليل لمسار المكتبة عند تحميل ملف أساسي في gdb على Linux

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

  •  01-07-2019
  •  | 
  •  

سؤال

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

أرغب في تحليل هذا التفريغ الأساسي في gdb.

على سبيل المثال:

gdb path/to/executable path/to/corefile

مكتباتي موجودة في الدليل الحالي.

في الماضي ، رأيت Defuggers ينفذ هذا من خلال توفير الخيار "-P". أو "-P /=." ؛لذلك سؤالي هو:

كيف يمكنني تحديد تحميل المكتبات أولاً من المسارات المتعلقة بالدليل الحالي الخاص بي عند تحليل ملف أساسي في gdb؟

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

المحلول

ابدأ تشغيل gdb دون تحديد الملف القابل للتنفيذ أو الملف الأساسي، ثم اكتب الأوامر التالية:

set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile

ستحتاج إلى التأكد من عكس مسار مكتبتك تمامًا من النظام المستهدف.ما ورد أعلاه مخصص لتصحيح أخطاء الأهداف التي لا تتطابق مع مضيفك، ولهذا السبب من المهم تكرار بنية نظام الملفات الجذر الذي يحتوي على مكتباتك.

إذا كنت تقوم بتصحيح أخطاء خادم عن بعد له نفس البنية وإصدار Linux/glibc مثل مضيفك، فيمكنك القيام بما يلي فد مقترح:

set solib-search-path <path>

إذا كنت تحاول تجاوز بعض المكتبات، ولكن ليس كلها، فيمكنك نسخ بنية دليل المكتبة الهدف إلى مكان مؤقت واستخدام solib-absolute-prefix الحل الموصوف أعلاه.

نصائح أخرى

لست متأكدًا من أن هذا ممكن على الإطلاق داخل gdb ولكني لست خبيرًا.

ومع ذلك يمكنني التعليق على لينكس رابط ديناميكي.يجب أن يقوم ما يلي بطباعة مسار جميع المكتبات المشتركة التي تم حلها والمكتبات التي لم يتم حلها.

ldd path/to/executable

نحتاج إلى معرفة كيفية ربط مكتباتك المشتركة بالملف القابل للتنفيذ.للقيام بذلك، استخدم الأمر التالي:

readelf -d path/to/executable | grep RPATH
  • في حالة عدم طباعة الأمر لأي شيء، سيستخدم الرابط الديناميكي المواقع القياسية بالإضافة إلى متغير البيئة LD_LIBRARY_PATH للعثور على المكتبات المشتركة.

  • إذا قام الأمر بطباعة بعض الأسطر، فسوف يتجاهل الرابط الديناميكي LD_LIBRARY_PATH ويستخدم مسارات r المضمنة بدلاً من ذلك.

    إذا كانت المسارات المدرجة مطلقة، فإن الحل الوحيد الذي أعرفه هو نسخ (أو ربط) مكتباتك بالمواقع المدرجة.

    إذا كانت المسارات المدرجة نسبية، فسوف تحتوي على $ORIGIN والذي سيتم استبداله في وقت التشغيل بمسار الملف القابل للتنفيذ.انقل الملف القابل للتنفيذ أو المكتبات المطابقة.

لمزيد من المعلومات، يمكنك البدء بـ:

man ld.so

لقد وجدت هذا المقتطف على Developer.apple.com

set solib-search-path path

إذا تم تعيين هذا المتغير ، فإن PATH عبارة عن قائمة مدللة مفصولة بالقولون للبحث عن المكتبات المشتركة. solib-search-path' is used after فشل Solib-Absolute-Prefix في تحديد موقع المكتبة ، أو إذا كان المسار إلى المكتبة نسبيًا بدلاً من المطلق.إذا كنت تريد استخدام solib-search-path' instead of Solib-Absolute-Prefix "، تأكد من تعيين" solib-absolute-prefix "على دليل غير موجود لمنع GDB من العثور على مكتبات مضيفك.

يحرر:

لا أعتقد أن استخدام الإعداد أعلاه يلحق الدلائل التي أضفتها، ولكن يبدو أنه يقوم بإلحاقها، لذلك يتم التقاط الملفات المفقودة من نظامي الحالي في المسارات التي أضفتها.أعتقد أن تعيين بادئة solib-absolute-prefix على شيء مزيف وإضافة أدلة في مسار solib-search-path بالترتيب الذي أحتاجه قد يكون حلاً كاملاً.

يمكنك أيضًا تعيين LD_PRELOAD لكل مكتبة أو LD_LIBRARY_PATH إلى الدليل الحالي عند استدعاء gdb.لن يتسبب هذا في حدوث مشكلات إلا إذا حاول gdb نفسه استخدام أي من المكتبات التي تقوم بتحميلها مسبقًا.

ملاحظة هامة:

إذا كنت تقوم بتجميع متقاطع ومحاولة تصحيحها مع GDB ، فبعد الانتهاء من ذلك
file ECECUTABLE_NAME إذا رأيت شيئًا ما.يحب :

Using host libthread_db library "/lib/libthread_db.so.1"

ثم تحقق مما إذا كان لديك libthread_db لنظامك المستهدف.لقد وجدت الكثير من المشاكل المماثلة على شبكة الإنترنت.لا يمكن حل هذه المشكلة بمجرد استخدام "set solib-"، بل يتعين عليك إنشاء libthread_db باستخدام المترجم المتقاطع أيضًا.

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