天天看点

readelf和ldd分析elf文件

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

readelf和ldd分析elf文件

注意,ld-linux.so 本身就是一个 ELF 共享库,但它是静态编译的并且不具备共享库依赖项。当需要动态链接时,内核会引导动态链接(ELF 解释器),该链接首先会初始化自身,然后加载指定的共享对象(已加载则不必)。接着它会执行必要的再定位,包括目标共享对象所使用的共享对象。

#readelf -l cpuid2.o

There are no program headers in this file.

ldd命令

Linux 提供了很多种查看和解析 ELF 对象(包括共享库)的工具。其中最有用的一个当属 ldd命令,可以使用它来发现共享库依赖项。

#ldd cpuid2

readelf和ldd分析elf文件

ldd所告诉您的是:该 ELF 映像依赖于 linux-gate.so(一个特殊的共享对象,它处理系统调用,它在文件系统中无关联文件),GNU C库(libc.so)以及 Linux 动态加载器(因为它里面有共享库依赖项)。

#ldd cpuid2.o

ldd: 警告: 你没有执行权限 `./cpuid2.o'

不是动态可执行文件

readelf识别对象内可再定位的C库

readelf 命令是一个有很多特性的实用程序,它让您能够解析和读取 ELF 对象。readelf 有一个有趣的用途,就是用来识别对象内可再定位的项。对于我们这个简单的程序来说,可以看到需要再定位的符号

#readelf -r cpuid2

readelf和ldd分析elf文件

从这个列表中,您可以看到各种各样的需要再定位(到 libc.so)的 C库调用。

#readelf -r cpuid2.o

readelf和ldd分析elf文件

readelf查看共享库的依赖库(NEEDED)和搜索名(SONAME)

#readelf -d cpuid2

readelf和ldd分析elf文件

#readelf -d cpuid2.o

无输出

readelf查看ELF头信息

#readelf -h cpuid2

readelf和ldd分析elf文件

#readelf -h cpuid2.o

readelf和ldd分析elf文件

附录

#man readelf

继续阅读