سؤال

نظرا لاستخدام Gentoo، غالبا ما يحدث ذلك بعد ترتبط برامج التحديث بالبرامج القديمة من المكتبات. عادة، يساعد RevDep-Rebuild في حل ذلك، ولكن هذه المرة هي تبعية على مكتبة الثعبان، و python-updater لن استلامه.

هل هناك تبديل "هرمي" ldd الذي يوضح لي ما هي المكتبة المشتركة التي تعتمد عليها مكتبة أخرى مشتركة؟ ترتبط معظم المكتبات الزمنية والتنفيذية فقط مقابل حفنة من المكتبات المشتركة الأخرى، والتي كانت تعمل بدورها مرتبطة بعدة حفنة، وتحويل تبعية المكتبة إلى قائمة كبيرة. أريد أن أعرف أي التبعية التي يجب إعادة بناءها مع الإصدار الجديد من مكتبة أخرى قمت بالترقية.

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

المحلول

إذا كنت تقوم بتشغيل portage2.2 مع FEATURES=preserve-libs, ، يجب أن نادرا ما تحتاج أبدا revdep-rebuild بعد الآن القديمة .so.سيتم الحفاظ على الفور حسب الحاجة (على الرغم من أنك لا تزال بحاجة إلى إعادة بناء بعناية، لأن الأشياء لا تزال تذهب كابوم libA.so.0 يريد libC.so.0 و libB.so.0 يريد libC.so.1 وبعض يريد ثنائي كليهما libA.so.0 و libB.so.0).


التي يقال، ماذا ldd هل هو الحصول على رابط ديناميكي للقيام بتحميل الملف القابل للتنفيذ أو المكتبة لأنه عادة ما يكون، ولكن طباعة بعض المعلومات على طول الطريق. هذه هي "مكتبة الاحتياجات الثنائية الثنائية تحتاج إلى مكتبة أخرى و HELLIP" بحث، لأن هذا ما يفعله رابط ديناميكي.

أنا حاليا تشغيل Linux / PPC32؛ على Linux / X86، الرابط الديناميكي عادة /lib/ld-linux.so.2, وعلى Linux / X86_64، الرابط الديناميكي عادة /lib/ld-linux-x86-64.so.2. وبعد هنا، أنا أسميها مباشرة فقط للمطرقة في النقطة التي كلها ldd ليس أكثر من برنامج نصي شل يدعو إلى الرابط الديناميكي لأداء سحره.

$ /lib/ld.so.1 / sbin / badblocks الاستعمال: / sbin / barbblocks [-b block_size] [-i input_file] [-O Output_File] [-svwnf] [-svwnf] [-c blocks_at_once] [-d delay_factor_between_Reads] [- ه max_bad_blocks] [-p num_passes] [-t test_pattern [-t test_pattern [...]]]] الجهاز [last_block [first_block]] $ ld_trace_loaded_objects = 1 /lib/ld.so.1 / sbin / badblocks linux-vdso32. SO.1 => (0x00100000) libext2fs.so.2 => /lib/libext2fs.so.2 (0x0ffa8000) libcom_err.so.2 => /lib/libcom_err.so.2 (0x0ff84000) libc.so.6 = > /lib/libc.so.6 (0x0fdfa000) libpthread.so.0 => /lib/libpthread.so.0 (0x0fdc0000) /lib/ld.so.1 (0x48000000) $ ld_trace_loaded_objects = 1 / lib / ld. So..1 /lib/libcom_err.so.2 Linux-vdso32.so.1 => (0x00100000) libpthread.so.0 => /lib/libpthread.so.0 (0x6ffa2000) libc.so.6 => / lib /libc.so.6 (0x6fe18000) /lib/ld.so.1 (0x203ba000) $ grep -l pthread / sbin / badblocks /lib/libcom_err.so.2 /lib/libcom_err.so.2

/sbin/badblocks لا تسرد libpthread.so.0 كإعالة مكتبة، ولكن يتم سحبها libcom_err.so.2.

هل مشكلتك في ذلك ldd لا يخرج شجرة التبعية لطيفة؟ يستخدم ldd -v.

$ ld_trace_loaded_objects = 1 ld_verbose = 1 /lib/ld.so.1 / sbin / badblocks linux-vdso32.so.1 => (0x00100000) libext2fs.so.2 => /lib/libext2fs.so.2 (0x0ffa8000) libcom_err .so.2 => /lib/libcom_err.so.2 (0x0FF84000) libc.so.6 => /lib/libc.so.6 (0x0fdfa000) libpthread.so.0 => /lib/libpthread.so.0 (0x0fdc0000) /lib/ld.so.1 (0x201f9000) معلومات الإصدار: / sbin / barbblocks: libc.so.6 (glibc_2.2) => /lib/libc.so.6 libc.so.6 (glibc_2. 4) => /lib/libc.so.6 libc.so.6 (glibc_2.1) => /lib/libc.so.6 libc.so.6 (glibc_2.0) => /lib/libc.so .6 libc.so.6 (glibc_2.3.4) => /lib/libc.so.6 /lib/libext2fs.so.2: libc.so.6 (glibc_2.1.3) => /lib/libc.so. 6 libc.so.6 (glibc_2.4) => /lib/libc.so.6 libc.so.6 (glibc_2.3) => /lib/libc.so.6 libc.so.6 (glibc_2.2 ) => /lib/libc.so.6 libc.so.6 (glibc_2.1) => /lib/libc.so.6 libc.so.6 (glibc_2.0) => /lib/libc.so. 6 /lib/libcom_err.so.2: LD.SO.1 (glibc_2.3) => /lib/ld.so.1 libpthread.so.0 (glibc_2.1) => /lib/libpthread.so.0 libpthread.so.0 (glibc_2.0) => /lib/libpthread.so.0 libc.so .6 (glibc_2.1.3) => /lib/libc.so.6 libc.so.6 (glibc_2.4) => /lib/libc.so.6 libc.so.6 (glibc_2.1) => / lib / libc.so.6 libc.so.6 (glibc_2.0) => /lib/libc.so.6 /lib/libc.so.6: ld.so.1 (glibc_private) => / lib / ld .so.1 ld.so.1 (glibc_2.3) => /lib/ld.so.1 /lib/libppthread.so.0: ld.so.1 (glibc_2.3) => / lib / ld. SO.1 LD.SO.1 (glibc_2.1) => /lib/ld.so.1 ld.so.1 (glibc_private) => /lib/ld.so.1 libc.so.6 (glibc_2.1.3 ) => /lib/libc.so.6 libc.so.6 (glibc_2.3.4) => /lib/libc.so.6 libc.so.6 (glibc_2.4) => /lib/libc.so. 6 libc.so.6 (glibc_2.1) => /lib/libc.so.6 libc.so.6 (glibc_2.3.2) => /lib/libc.so.6 libc.so.6 (glibc_2.2 ) => /lib/libc.so.6 libc.so.6 (glibc_private) => /lib/libc.so.6 libc.so.6 (glibc_2.0) => /lib/libc.so.6

إذا كنت تريد، يمكنك قراءة رؤوس ELF مباشرة بدلا من اعتمادا على الرابط الديناميكي.

قراءة $ قراءة / SBIN / Badblocks | مطلوب GREP 0x00000001 (مطلوب) المكتبة المشتركة: [libext2fs.so.2] 0x00000001 (مطلوب) المكتبة المشتركة: [libcom_err.so.2] 0x00000001 (مطلوب) المكتبة المشتركة: [libc.so.6] $ /libcom_err.so.2 | مطلوب GREP 0x00000001 (مطلوب) المكتبة المشتركة: [libphread.so.0] 0x00000001 (مطلوب) المكتبة المشتركة: [libc.so.6] 0x00000001 (مطلوب) المكتبة المشتركة: [LD.SO.1

يمكنك أيضا man ld.so للحيل اللطيفة الأخرى التي يمكنك اللعب بها glibcرابط ديناميكي.

نصائح أخرى

أرى العديد من التفاصيل المثيرة للاهتمام ولكن لا توجد إجابة مباشرة على السؤال المطروح.

النسخة "التسلسل الهرمي" من ldd يكون lddtree (من app-misc/pax-utils):

$ lddtree /usr/bin/xmllint 
xmllint => /usr/bin/xmllint (interpreter => /lib64/ld-linux-x86-64.so.2)
    libreadline.so.6 => /lib64/libreadline.so.6
        libncurses.so.5 => /lib64/libncurses.so.5
            libdl.so.2 => /lib64/libdl.so.2
    libxml2.so.2 => /usr/lib64/libxml2.so.2
        libicui18n.so.49 => /usr/lib64/libicui18n.so.49
            libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.1/32/libstdc++.so.6
                ld-linux.so.2 => /lib64/ld-linux.so.2
            libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.1/32/libgcc_s.so.1
        libicuuc.so.49 => /usr/lib64/libicuuc.so.49
        libicudata.so.49 => /usr/lib64/libicudata.so.49
        libz.so.1 => /lib64/libz.so.1
        liblzma.so.5 => /usr/lib64/liblzma.so.5
        libm.so.6 => /lib64/libm.so.6
    libpthread.so.0 => /lib64/libpthread.so.0
    libc.so.6 => /lib64/libc.so.6

كنت بحاجة إلى شيء مثل هذا، لذلك كتبت tldd, ، هنا يظهر تبعيات مكتبة الخاصة بها:

$ ./tldd ./tldd ./tldd └─libstdc ++. So.6 => /lib64/libstdc++.so.6 (0x0000003687c00000) ├─libm.so.6 => /lib64/libm.so.6 (0x00000036850000000000) │ │libc.so.6 => /lib64/libc.so.6 (0x0000003684c00000) │ └─ld-linux-x86-64.so.2 => /lib64/lllinux-x86-64.so. 2 (0x000000003684400000) └─libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003686c00000)

كنت سأقترح أيضا "عرض إلكتروني" ولكن أيضا ضمان بناء مع LDFLAGS = "- WL، - حسب الحاجة" إذا لم تكن بالفعل. هذا سيجعلك تضرب هذه المشكلة أقل في كثير من الأحيان. Portage 2.2's Preserve-Libs هو لطيف ولكني أجمع أنه ملثم في المقام الأول بسبب ذلك - فهو له عيوب.

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