سؤال

أحاول التجميع Samtools على خادم Solaris حيث ليس لدي جذر. Samtools يعتمد على Zlib. لا يتم تجميع النظام Zlib على هذا الجهاز بدعم كبير من الملفات ، لذا فإن تجميع Samtools مقابل هذا الإصدار له التأثير المتوقع: Samtools يتعامل فقط مع الملفات الصغيرة. أحتاجها لتكون قادرة على التعامل مع الملفات الكبيرة. لحسن الحظ ، هناك نسخة من ZLIB جمعها المسؤول في /usr/local/apps/zlib-1.2.5/ بدعم كبير من الملفات. يمكنني التجميع ضد هذا عن طريق إضافة -R /usr/local/apps/zlib-1.2.5/lib إلى cflags ، ولكن هذا يبدو أنه لا يعمل. الأعراض على النحو التالي:

عندما أحاول تشغيل Samtools ، تعطل مع هذا الخطأ:

ld.so.1: samtools: fatal: relocation error: file samtools: symbol gzopen64: referenced symbol not found

إذا أضفت /usr/local/apps/zlib-1.2.5/ إلى ld_library_path ، ثم يعمل Samtools بشكل جيد.

تحليل Samtools مع LDD و Readelf يعطي ما يلي:

$ ldd -r samtools
        libnsl.so.1 =>   /usr/lib/libnsl.so.1
        libsocket.so.1 =>        /usr/lib/libsocket.so.1
        libresolv.so.2 =>        /usr/lib/libresolv.so.2
        libm.so.2 =>     /usr/lib/libm.so.2
        libcurses.so.1 =>        /usr/lib/libcurses.so.1
        libz.so =>       /usr/lib/libz.so
        libc.so.1 =>     /usr/lib/libc.so.1
        libmp.so.2 =>    /usr/lib/libmp.so.2
        libmd.so.1 =>    /usr/lib/libmd.so.1
        libscf.so.1 =>   /usr/lib/libscf.so.1
        libdoor.so.1 =>  /usr/lib/libdoor.so.1
        libuutil.so.1 =>         /usr/lib/libuutil.so.1
        libgen.so.1 =>   /usr/lib/libgen.so.1
        symbol not found: gzopen64              (samtools)

$ ldd -s samtools

   ...(snip)...

   find object=libz.so; required by samtools
    search path=/usr/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/lib  (LD_LIBRARY_PATH)
    trying path=/usr/lib/libz.so
        libz.so =>       /usr/lib/libz.so

   ...(snip)...

$ readelf -d samtools | grep RPATH
 0x0000000f (RPATH)                      Library rpath: [/usr/local/apps/zlib-1.2.5/lib:/usr/local/apps/gcc-4.5.1/lib]

لذا /usr/local/apps/zlib-1.2.5/lib من الواضح أنه في RPAT الثنائي ، الذي أفهم أنه من المفترض أن يتم البحث في وقت التشغيل للمكتبات المشتركة. لكن، ldd -s يوضح أن هذا الدليل لم يتم تفتيشه أبدًا. إن إضافة هذا المسار إلى ld_library_path وإعادة تشغيل أوامر LDD له التأثير المتوقع: يتم البحث في الدليل ويتم العثور على الإصدار الصحيح من libz.

فكيف يمكنني إجبار Samtools على البحث في /usr/local/apps/zlib-1.2.5/lib في وقت التشغيل دون استخدام ld_library_path؟


تحرير: الوثائق هنا يبدو أنه يشير إلى أن -R الخيار هو الشيء الصحيح الذي يجب القيام به. لكنه لا يعمل.

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

المحلول

أنا لست خبيرًا في سولاريس بأي حال من الأحوال ، لكن هذا الخط:

find object=libz.so; required by samtools
 search path=/usr/lib:/usr/openwin/lib:/usr/dt/lib:/usr/local/lib  (LD_LIBRARY_PATH)

يبدو أنه يشير لي ذلك LD_LIBRARY_PATH تم تعيينه بالفعل ، و /usr/lib المسار فيه هو الأسبقية على أي مسارات رابط وقت التشغيل. هل يمكنك إلغاء تعيين ld_library_path إذا كان موجودًا في الواقع ومعرفة ما إذا كان هذا يحلها؟

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