Linux / GCC: وظيفة LDD من داخل برنامج C / C ++
-
19-09-2019 - |
سؤال
هل هناك طريقة بسيطة وفعالة لمعرفة ذلك مرتبطا ديناميكيا ELF
يفتقد مطلوبة. لذلك لتشغيل، كل ذلك من في داخل من برنامج C / C ++؟
أحتاج إلى برنامج مع وظيفة مماثلة إلى حد ما ldd
, ، دون محاولة تنفيذ ELF
لمعرفة التبعيات (التقى / غير مستاء) في النظام. ربما يسألون أداة Ld-linux.so عبر بعض المكتبة؟ (أنا مبتدئ في هذا الجزء من Linux =)
ملاحظة: قراءة شفرة المصدر
ldd
لم يكن مفيدا للغاية للنوايا: يبدو ذلكldd
في الواقع تفرج عملية أخرى وتنفيذ البرنامج.
إذا لم يكن من الممكن معرفة أن البرنامج يحتوي على تبعيات غير مستوفاة دون تنفيذها، فهل هناك طريقة، على الأقل، سرعان ما يسرد .so المطلوبة لذلك ELF
كل ذلك من داخل برنامجي؟
شكرا مقدما =)
المحلول
حسب LD.SO (8), ، وضع متغير البيئة LD_TRACE_LOADED_OBJECTS
إلى سلسلة غير فارغة سوف تعطي ldd
- مثل النتائج (بدلا من تنفيذ الثنائي أو المكتبة بشكل طبيعي).
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");
نصائح أخرى
هل حاولت dlopen
وظيفة؟ يمكنك استخدام هذا لتحميل مكتبة ديناميكية (أو لحالتك، إلى CKECK إذا كانت مكتبة يمكن تحميلها).
وجود قائمة من المكتبات اللازمة أكثر صعوبة، إلقاء نظرة handle_dynamic
وظيفة في المصدر للعائلات
ماذا عن استخدام PTTRACE () لتتبع المكالمات المفتوحة () للعثور على كل ما يعتمده البرنامج على (ومع ذلك، يتضمن الإخراج ملفات، وليس فقط المكتبات) .or ربما تصفية الإخراج عن طريق البادئة اسم الملف "/ lib" يساعد وبعد