由于使用Gentoo,通常会出现在更新后程序链接到旧版本的库的情况。通常情况下,revdep-rebuild可以帮助解决这个问题,但这次是对Python库的依赖关系,而python-updater
无法识别。
是否有一种“分层”变体的ldd
,它可以显示哪个共享库依赖于另一个共享库?大多数情况下,库和可执行文件仅链接到少量其他共享库,这些共享库反过来又链接到少量库,从而将库依赖关系转化为一个大列表。我想知道我必须使用另一个库的新版本重新构建的依赖关系。
我看到许多有趣的细节,但没有直接回答问题。
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
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
所做的就是让动态链接器像往常一样加载可执行文件或库,并在此过程中打印一些信息。这是一个递归的“二进制文件需要库需要其他库”搜索,因为这就是动态链接器的工作原理。/lib/ld-linux.so.2
,而在 Linux/x86_64 上,动态链接器通常是/lib/ld-linux-x86-64.so.2
。在这里,我直接调用它,只是为了强调ldd
无非是一个调用动态链接器执行其操作的 shell 脚本。
$ /lib/ld.so.1 /sbin/badblocks 使用方法: /sbin/badblocks [-b 块大小] [-i 输入文件] [-o 输出文件] [-svwnf] [-c 同时检查块数] [-d 读取之间的延迟因子] [-e 最大坏块数] [-p 检查次数] [-t 测试模式 [-t 测试模式 [...]]] 设备 [最后块 [第一块]] $ 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/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
man ld.so
以了解其他有趣的技巧,您可以使用它来玩转glibc
的动态链接器。ldd -v
命令的树状部分仅显示具有版本化符号的库。 - marcinжҲ‘йңҖиҰҒзұ»дјјзҡ„дёңиҘҝпјҢжүҖд»ҘжҲ‘еҶҷдәҶtldd
пјҢиҝҷйҮҢеұ•зӨәе®ғиҮӘе·ұзҡ„еә“дҫқиө–пјҡ
$ ./tldd ./tldd ./tldd в””в”Җlibstdc++.so.6 => /lib64/libstdc++.so.6 (0x0000003687c00000) в”ңв”Җlibm.so.6 => /lib64/libm.so.6 (0x0000003685000000) в”Ӯ в””в”Җlibc.so.6 => /lib64/libc.so.6 (0x0000003684c00000) в”Ӯ в””в”Җld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x0000003684400000) в””в”Җlibgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003686c00000)
дҪ д№ҹеҸҜд»ҘдҪҝз”Ёldd -v
жқҘжҹҘзңӢжүҖжңүе…ұдә«еә“зҡ„жүҖжңүдҫқиө–йЎ№пјҢдҪҶе®ғдёҚдјҡжҳҫзӨәеұӮж¬Ўз»“жһ„ж ‘гҖӮ
tldd
的最新更新,效果非常好!是一个很棒的小实用工具! - erwintldd
和lddtree
(pax-utils)时得到了稍微不同的依赖树。不确定哪一个是最终的版本。 - ontherockstldd
和lddtree
(pax-utils)得到了稍有不同的依赖树。不确定哪一个是最终的。 - undefined
sudo apt install pax-utils
来获取lddtree
。 - Chris Seymour