C/C++编译技术——Linux工具集
-
快速查看工具
-
file
file工具可以查看几乎任何类型文件的详细信息,可以查看二进制文件的绝大多数基本信息。
-
size
size工具能够快速获取ELF节的字节长度信息。
-
-
详细分析工具
-
ldd
ldd可以显示出客户二进制文件启动时需要加载的动态库的完整列表。
ldd的限制:
- ldd无法识别出运行时通过调用dlopen()函数动态加载的动态库。
- 运行某些版本的ldd可能会导致安全问题。
更安全的替代方法:
objdump -p /path/to/program | grep NEEDED readelf -d /path/to/program | grep NEEDED
但这两个工具只会读取二进制文件的直接依赖项的列表,而不会再去分析其间接依赖性。
-
nm
nm程序可以列出二进制文件的符号列表,可以输出符号并显示对应的符号类型。
-
列出二进制文件的所有符号
nm <path>
-
只列出动态节中的符号,即共享库中导出的或对外可见的符号
nm -D <path>
-
列出未经过名称修饰的格式
nm -C <path>
-
打印出共享库中名称修饰后的动态符号
nm -D --no-demangle <path>
-
在相同目录下的二进制文件中搜索符号,将所有在库中找到的符号打印出来
nm —A <path>/* | grep symbol-name
-
列出库中未定义的符号
nm -u <path>
-
-
objdump
-
解析ELF头
获取目标文件头信息,通过ELF头信息快速获取二进制文件类型(目标文件、静态库、动态库和可执行文件)和入口信息。
objdump -f <path>
-
列出并查看节信息,列出所有二进制文件的节
objdump -h <path>
-
列出所有符号
objdump -t <path> //与nm <path>效果相同
-
只列出动态符号
objdump -T <path> //与nm -D <path>效果相同
-
查看动态节或段
objdump -p <path> //输出的第一部分是段的名称
-
查看重定位节
objdump -R <path>
-
查看节中的数据
objdump -s -j <节名称> <path>
-
反汇编代码
objdump -d -Mintel <path> // Intel风格
-
-
readelf
readelf的功能在objdump工具中都可以找到,但两者有区别:
- readelf只支持ELF二进制格式,objdump可以解析包括Windows PE/COFF格式。
- readelf不依赖二进制文件描述库。GUN的所有目标文件解析工具都依赖这个库。
-
解析ELF头
readelf -h <path>
-
列出并查看节信息
readelf -S <path>
-
列出所有符号
readelf --symbols <path> //与nm <path>效果相同
-
只列出动态符号
readelf --dyn-syms <path> //与nm -D <path>效果相同
-
查看动态节
readelf -d <path> //rpath
-
查看重定位节
readelf -r <path>
-
查看节中的数据
readelf -x <path>
-
列出并查看段
readelf -segments <path>
-