当前位置:嗨网首页>书籍在线阅读

10-使用共享库的有用工具

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

41.5 使用共享库的有用工具

本节将简要介绍对分析共享库、可执行文件以及编译过的目标文件(.o)有用的一组工具。

ldd命令

ldd(1)(列出动态依赖)命令显示了一个程序运行所需的共享库,如下所示。

1041.png ldd命令会解析出每个库引用(使用的搜索方式与动态链接器一样)并以下面的形式显示结果。

1042.png 对于大多数ELF可执行文件来讲,ldd至少会列出与ld-linux.so.2、动态链接器以及标准C库libc.so.6相关的条目。

在一些架构上,C库的名称是不同的。如在IA-64和Alpha上,这个库的名称是libc.so.6.1。

objdump和readelf命令

objdump命令能够用来获取各类信息——包括反汇编的二进制机器码——从一个可执行文件、编译过的目标以及共享库中。它还能够用来显示这些文件中各个ELF节的头部信息,当这样使用objdump时它就类似于readelf,readelf能显示类似的信息,但显示格式不同。本章结尾处将会列出更多有关objdump和readelf的信息源。

nm命令

nm命令会列出目标库或可执行程序中定义的一组符号。这个命令的一种用途是找出哪些库定义了一个符号。如要找出哪个库定义了crypt()函数则可以像下面这样做。

1043.png nm的–A选项指定了在显示符号的每一行的开头处应该列出库的名称。这样做是有必要的,因为在默认情况下,nm只列出库名一次,然后在后面会列出库中包含的所有符号,这对于像上面那样进行某种过滤的例子来讲是没有用处的。此外,这里还丢弃了标准错误输出以便隐藏与nm命令无法识别文件格式有关的错误消息。从上面的输出中可以看出,crypt()被定义在了libcrypt库中。