曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3535|回复: 0
打印 上一主题 下一主题

ldd -- 打印程序所需共享库

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2010-12-13 22:00:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ldd 是一个脚本。它可以用来显示模块的依赖关系。
$ which ldd
/usr/bin/ldd
$ file /usr/bin/ldd
/usr/bin/ldd: Bourne-Again shell script text executable

简单的一个应用,如查看 ls 命令所需要的共享库:
$ which ls
/bin/ls
$ ldd /bin/ls
        linux-gate.so.1 =>  (0xb76e7000)
        librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb76ce000)
        libselinux.so.1 => /lib/libselinux.so.1 (0xb76b5000)
        libacl.so.1 => /lib/libacl.so.1 (0xb76ad000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7552000)
        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7539000)
        /lib/ld-linux.so.2 (0xb76e8000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7535000)
        libattr.so.1 => /lib/libattr.so.1 (0xb7530000)
实际上,ldd 是通过设置一系列环境变量来查看程序的共享库。比如,将 LD_TRACE_LOADED_OBJECTS 设置为 1:
$ export LD_TRACE_LOADED_OBJECTS=1
$ ls
        linux-gate.so.1 =>  (0xb7704000)
        librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb76eb000)
        libselinux.so.1 => /lib/libselinux.so.1 (0xb76d2000)
        libacl.so.1 => /lib/libacl.so.1 (0xb76ca000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb756f000)
        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7556000)
        /lib/ld-linux.so.2 (0xb7705000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7552000)
        libattr.so.1 => /lib/libattr.so.1 (0xb754d000)
可以看到,执行 ls 时,不是列出了当前的目录内容,而是列出 ls 命令所需的共享库。要复原,只需要将环境变量 LD_TRACE_LOADED_OBJECTS 设置为 0 即可:
$ unset LD_TRACE_LOADED_OBJECTS

使用 ldd 时默认设置的环境变量就是 LD_TRACE_LOADED_OBJECTS,还有其它几个变量对应着该命令的选项:
-d, --data-relocs --- LD_WARN=yes
-r, --function-relocs --- LD_WARN=yes 和 LD_BIND_NOW=yes
-u, --unused --- LD_DEBUG="unused"
v, --verbose --- LD_VERBOSE=yes

ldd 的工作原理,实际通过执行 /lib/ld-linux.so.2 来实现
$ ls -al /lib/ld-linux.so.2
lrwxrwxrwx 1 root root 9 10-31 16:01 /lib/ld-linux.so.2 -> ld-2.7.so

$ /lib/ld-linux.so.2 --list /bin/ls
        linux-gate.so.1 =>  (0xb7753000)
        librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb773a000)
        libselinux.so.1 => /lib/libselinux.so.1 (0xb7721000)
        libacl.so.1 => /lib/libacl.so.1 (0xb7719000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb75be000)
        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb75a5000)
        /lib/ld-linux.so.2 (0xb7754000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb75a1000)
        libattr.so.1 => /lib/libattr.so.1 (0xb759c000)
由输出可见, /lib/ld-linux.so.2 --list /bin/ls 与直接 ldd /bin/ls 是一样的。

更多关于 ldd 信息以及工作原理可以阅读 ldd 的脚本文件获得。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 05:07 , Processed in 0.059890 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表