由于使用Gentoo,更新后的程序经常会与旧版本的库相链接.通常情况下,revdep rebuild有助于解决这个问题,但这次它依赖于python库,而python-updater
不会接受它.
是否有一个ldd
的"分层"变体,它向我展示了哪个共享库取决于哪个共享库?大多数情况下,库和可执行文件只针对少数几个其他共享库进行链接,而这些共享库又针对少数共享库进行链接,从而将库依赖关系变成一个大列表.我想知道我需要用我升级的另一个库的新版本重建哪个依赖项.
由于使用Gentoo,更新后的程序经常会与旧版本的库相链接.通常情况下,revdep rebuild有助于解决这个问题,但这次它依赖于python库,而python-updater
不会接受它.
是否有一个ldd
的"分层"变体,它向我展示了哪个共享库取决于哪个共享库?大多数情况下,库和可执行文件只针对少数几个其他共享库进行链接,而这些共享库又针对少数共享库进行链接,从而将库依赖关系变成一个大列表.我想知道我需要用我升级的另一个库的新版本重建哪个依赖项.
If you are running Portage≥2.2 with FEATURES=preserve-libs
, you should rarely ever need revdep-rebuild
anymore as old .so.
vers will be preserved as needed (though you still need to rebuild carefully, as stuff still goes kaboom when libA.so.0
wants libC.so.0
and libB.so.0
wants libC.so.1
and some binary wants both libA.so.0
and 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
只不过是一个shell脚本,它调用动态链接器来执行它的魔法.
$ /lib/ld.so.1 /sbin/badblocks Usage: /sbin/badblocks [-b block_size] [-i input_file] [-o output_file] [-svwnf] [-c blocks_at_once] [-d delay_factor_between_reads] [-e max_bad_blocks] [-p num_passes] [-t test_pattern [-t test_pattern [...]]] device [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) Version information: /sbin/badblocks: 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/libpthread.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头,而不是依赖于动态链接器.
$ readelf -d /sbin/badblocks | grep NEEDED 0x00000001 (NEEDED) Shared library: [libext2fs.so.2] 0x00000001 (NEEDED) Shared library: [libcom_err.so.2] 0x00000001 (NEEDED) Shared library: [libc.so.6] $ readelf -d /lib/libcom_err.so.2 | grep NEEDED 0x00000001 (NEEDED) Shared library: [libpthread.so.0] 0x00000001 (NEEDED) Shared library: [libc.so.6] 0x00000001 (NEEDED) Shared library: [ld.so.1]
你还可以用glibc
的动态链接器玩man ld.so
个其他可爱的小把戏.