ابحث عن دليل في مسار البحث في المكتبة المشتركة

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

  •  26-09-2019
  •  | 
  •  

سؤال

أريد dlopen () كل مكتبة مشتركة في دليل معين. من أجل القيام بذلك،
ما هي أنظف طريقة لاسترداد مسار البحث في مكتبة Linux. أم أن هناك طريقة أسرع لإيجاد دليل معين في هذا المسار؟
سيكون Posix أفضل.

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

المحلول

لا يدعم Posix آلية لمعرفة الدلائل على مسار البحث عن المكتبة المشتركة (لا يفرض ذلك LD_LIBRARY_PATH, ، على سبيل المثال) ، لذلك أي حل هو بطبيعته إلى حد ما من النظام الأساسي.

يعرض Linux بعض المشكلات لأن القيم المراد استخدامها يمكن أن تستند إلى محتويات /etc/ld.so.conf وكذلك أي قيمة وقت التشغيل في LD_LIBRARY_PATH متغيرات البيئة؛ أنظمة أخرى تقدم مشاكل مماثلة. تختلف المواقع الافتراضية أيضًا حسب النظام - مع /lib و /usr/lib كونها معتادة لآلات Linux 32 بت ولكن /lib64 و /usr/lib64 يتم استخدامها على ما لا يقل عن 64 بت. ومع ذلك ، تستخدم المنصات الأخرى مواقع أخرى لبرنامج 64 بت. على سبيل المثال ، يستخدم سولاريس /lib/sparcv9 و /usr/lib/sparcv9, على سبيل المثال (على الرغم من ذكر المستندات /lib/64 و /usr/lib/64, ، إنها تعارض مع sparcv9 الدلائل). Solaris لديه أيضا متغيرات البيئة LD_LIBRARY_PATH_64 و LD_LIBRARY_PATH_32. يستخدم HP-UX و AIX تقليديًا متغيرات أخرى من LD_LIBRARY_PATH -- SHLIB_PATH و LIBPATH, ، IIRC - على الرغم من أنني أعتقد أن AIX تستخدم الآن LD_LIBRARY_PATH جدا. وعلى Solaris ، فإن أداة تكوين المكتبات المشتركة هي "Crle" (تكوين بيئة ربط وقت التشغيل) والتناظرية من /etc/ld.so.conf اما /var/ld/ld.config أو /var/ld/64/ld.config. أيضًا ، بالطبع ، تختلف الامتدادات على المكتبات المشتركة (.so, .sl, .dylib, .bundle, ، إلخ).

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

  • لكل دليل سميته أي من المصادر:
    • افتح الدليل الفرعي ذي الصلة (opendir())
      • اقرأ كل اسم ملف (readdir()) بدوره
      • يستخدم dlopen() على مسار الملفات ذات الصلة.
      • قم بعمل أي تحليل مناسب لك.
      • يستخدم dlclose()
    • يستخدم closedir()

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

نصائح أخرى

لست متأكدًا من أنه من الممكن القيام بذلك وأن أكون محمولًا. نظرًا لأن هذا السؤال يدور حول Linux ، فقد لا تكون قابلية النقل ذات أهمية قصوى. ثم لا أفهم قيود Posix. هل يمكنك التوضيح؟

ربما يتعين عليك إما تنفيذ وظيفة البحث المفصلة في man 8 ld.so, ، والذي يتضمن المسح /etc/ld.so.conf بالإضافة إلى LD_LIBRARY_PATH, أو جعل /lib/ld.so افعل ما تريده من أجلك وتوضع الإخراج. يمكن أن يكون سطر أوامر غير محدد لذلك:

export LD_PRELOAD=THISLIBRARYSODOESNOTEXIST
strace -s 4096 /bin/true 2>&1 | sed -n 's/^open("\([^"]*\)\/THISLIBRARYSODOESNOTEXIST".*$/\1\/YOURSUBDIRHERE/gp'
unset LD_PRELOAD

يمكنك بعد ذلك تعداد الملفات مع مكالمات Posix opendir(3) و readdir(3).

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