1. elf 文件格式
linux系统中,gcc编译器编译出的object文件、可执行文件都属于elf文件。
elf文件由三个部分组成:elf header、program headers|section headers、sections|program segments。
如果是executable文件,则section部分是不需要的;如果是loadable文件,则program segment部分是不需要的。
2. readelf工具
readelf命令用途: Displays information about an elf file.
查询文件所有信息
readelf object-file-name -a |
查询elf header
readelf object-file-name -h |
查询符号表
readelf object-file-name -s |
查询所有section详细信息
readelf object-file-name -t 或者 readelf object-file-name -S |
dump某个section的信息
readelf object-file-name -p section-name|section-index readelf object-file-name -x section-name|section-index readelf object-file-name -R section-name|section-index |
使用 readelf 来显示程序标题
#readelf -l cpuid2

注意,ld-linux.so 本身就是一个 ELF 共享库,但它是静态编译的并且不具备共享库依赖项。当需要动态链接时,内核会引导动态链接(ELF 解释器),该链接首先会初始化自身,然后加载指定的共享对象(已加载则不必)。接着它会执行必要的再定位,包括目标共享对象所使用的共享对象。
#readelf -l cpuid2.o
There are no program headers in this file.
ldd命令
Linux 提供了很多种查看和解析 ELF 对象(包括共享库)的工具。其中最有用的一个当属 ldd命令,可以使用它来发现共享库依赖项。
#ldd cpuid2
ldd所告诉您的是:该 ELF 映像依赖于 linux-gate.so(一个特殊的共享对象,它处理系统调用,它在文件系统中无关联文件),GNU C库(libc.so)以及 Linux 动态加载器(因为它里面有共享库依赖项)。
#ldd cpuid2.o
ldd: 警告: 你没有执行权限 `./cpuid2.o'
不是动态可执行文件
readelf识别对象内可再定位的C库
readelf 命令是一个有很多特性的实用程序,它让您能够解析和读取 ELF 对象。readelf 有一个有趣的用途,就是用来识别对象内可再定位的项。对于我们这个简单的程序来说,可以看到需要再定位的符号
#readelf -r cpuid2
从这个列表中,您可以看到各种各样的需要再定位(到 libc.so)的 C库调用。
#readelf -r cpuid2.o
readelf查看共享库的依赖库(NEEDED)和搜索名(SONAME)
#readelf -d cpuid2
#readelf -d cpuid2.o
无输出
readelf查看ELF头信息
#readelf -h cpuid2
#readelf -h cpuid2.o
附录
#man readelf