由于使用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个其他可爱的小把戏.

Linux相关问答推荐

获取Perl文件::Tail开始在最后流传输文件

是否可以在Bash正则表达式中排除?

cu可以从串口读取,但我自己的C程序不能

动态链接ELF文件是否需要ELF节头表?

如何使 awk 输出更具可读性?

在 Linux 上的 std::threads 中创建子进程

如何在 gcc 搜索路径上防止多个版本的 Boost?

如何使用netcat为DPDK实例提供输入?

使用 bash 命令将文件从子文件夹复制到另一个

RabbitMQ 安装后没有自动启动

c++进程状态中的+是什么意思

从 bash shell 等效项在fish shell 上设置 $ANDROID_SDK_ROOT

Dockerfile:无法复制文件

Stripping linux 共享库

Linux命令行如何接受没有pin的蓝牙设备配对

增加 mysql docker 中的 max_allowed_pa​​cket 大小

在 cron 作业(job)中执行 PHP 脚本

在 Emacs 中匹配括号的命令是什么?

什么是适用于 Linux 的好的 Prolog IDE?

Linux shell 中的排序和唯一性