linux系统readelf命令使用指南
readelf 是 Linux 下一个强有力的工具,专门用于分析 ELF(Executable and Linkable Format)格式的文件,如可执行程序、目标文件(.o)和共享库(.so)。它独立于 BFD 库,因此能提供比 objdump 更具体的信息。1. 核心常用命令 (必会)
假设目标文件为
myprogram:readelf -a myprogram:显示全部信息(包含文件头、段头、符号表、重定位信息、动态信息等)。readelf -h myprogram:查看 ELF 文件头(ELF Header)。包括文件类型、机器架构、入口地址等。readelf -S myprogram:查看节头表(Section Headers)。显示程序由哪些部分组成(如.text代码段、.data数据段、.bss)。readelf -l myprogram:查看段头表(Program Headers/Segments)。显示程序在运行时如何映射到内存中(主要针对可执行文件)。readelf -s myprogram:查看符号表(Symbol Table)。列出变量、函数等符号。readelf -d myprogram:查看动态段(Dynamic Section)。主要用于动态链接库分析,查看所依赖的共享库(NEEDED)。readelf -r myprogram:显示重定位信息(Relocations)。
2. 常用功能进阶示例
2.1 查看依赖库
查看一个共享库或可执行文件需要哪些
.so 文件:readelf -d /bin/ls | grep NEEDED
2.2 查找符号定义 (函数或变量)
查看符号表,查找特定函数
main 的位置:readelf -s myprogram | grep main
2.3 查看文件架构 (x86-64, ARM)
readelf -h myprogram | grep Machine
2.4 查看指定节内容 (16进制)
查看数据段(如索引为 15 的
.rodata)的 16 进制内容:readelf -x 15 myprogram
# 或使用节名称
readelf -x .rodata myprogram
2.5 友好显示长行 (-W)
readelf 默认在 80 列换行。对于 64 位 ELF 文件,添加 -W (wide) 参数能在一行中完整显示段信息,更具可读性。 [6, 8]readelf -SW myprogram
3. Readelf 选项速查表
| 选项 | 对应长选项 | 描述 |
|---|---|---|
| -a | --all |
显示所有信息 (等价于 -h -l -S -s -r -d -V -A -I) |
| -h | --file-header |
显示 ELF 文件头信息 |
| -l | --segments |
显示段头信息(执行视图) |
| -S | --sections |
显示节头信息(链接视图) |
| -s | --symbols |
显示符号表 |
| -d | --dynamic |
显示动态段信息 |
| -r | --relocs |
显示重定位信息 |
| -x | --hex-dump |
以十六进制显示指定段内容 |
| -W | --wide |
宽行输出,不折行 |
4. 常见场景
- 分析段错误 (Segmentation Fault):检查核心转储(Core Dump)文件:
readelf -h core。 - 调试动态库加载:使用
readelf -d检查NEEDED字段。 - 逆向工程:通过
readelf -s查看导出的符号列表。 - 定位代码布局:使用
readelf -S分析.text或.rodata的地址和大小。
注意:
readelf 需要的 ELF 文件可以是可执行文件、.o 目标文件、.so 共享库,甚至 ar 命令打包的 .a 静态库。参考资料:
浙公网安备 33010602011771号