Linux共享对象文件分析指南
.so文件(Shared Object)是Linux系统中的动态链接库文件,类似于Windows系统中的.dll文件。它们包含了可由多个程序共享的代码和数据,用于实现动态链接。
常见的so文件通常位于/lib、/usr/lib等系统目录中,文件名通常以.so结尾,如libc.so.6。
readelf是专门用于显示ELF(Executable and Linkable Format)文件信息的工具,so文件就是ELF格式。
readelf -h libexample.so # 显示文件头信息 readelf -S libexample.so # 显示节头表 readelf -s libexample.so # 显示符号表 readelf -d libexample.so # 显示动态段信息 readelf -a libexample.so # 显示所有信息
objdump可以显示目标文件的各种信息。
objdump -t libexample.so # 显示符号表 objdump -T libexample.so # 显示动态符号表 objdump -x libexample.so # 显示所有头信息 objdump -d libexample.so # 反汇编代码段
nm命令用于列出目标文件中的符号。
nm libexample.so # 列出所有符号 nm -D libexample.so # 只显示动态符号 nm -C libexample.so # 显示C++符号的完整名称
ldd用于显示可执行文件或共享库的依赖关系。
ldd libexample.so
以下是一个查看libc.so.6文件符号表的示例:
$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep printf f40 i __nldbl___isoc99_scanf f40 i __isoc99_scanf@@GLIBC_2.7 f40 i __nldbl___isoc99_scanf f40 i __isoc99_scanf@GLIBC_2.7
这显示了libc库中与scanf相关的函数符号。
在大多数Linux发行版中,这些工具包含在binutils包中:
# Ubuntu/Debian sudo apt-get install binutils # CentOS/RHEL sudo yum install binutils # Fedora sudo dnf install binutils