linux 分层,linux – 分层ldd(1)

如果你使用FEATURES = preserve-libs运行Portage≥2.2,你应该很少需要revdep-rebuild,因为旧的.so.vers将根据需要保存(虽然你仍然需要仔细重建,因为当libA时,东西仍然会变成kaboom .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只不过是一个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其他可爱的技巧.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值