readelf 命令详解
readelf 是一个用于分析 ELF(Executable and Linkable Format)文件的命令行工具,可查看可执行文件、共享库、目标文件等的详细结构信息。与 objdump 相比,readelf 提供更深入的解析,且独立于 BFD 库,避免因 BFD 库的 Bug 导致解析失败。
语法(SYNOPSIS)
readelf [选项]... elffile...
核心功能(核心选项)
1. 基础信息查看
| 选项 | 说明 | 典型用途 |
|---|---|---|
-h--file-header | 显示 ELF 头部信息 | 查看文件类型、架构、入口点等 |
-l--program-headers--segments | 显示程序段表(Segment Headers) | 分析内存布局(如 .text, .data 段) |
-S--section-headers--sections | 显示节表(Section Headers) | 查看所有节(如 .symtab, .strtab) |
-e--headers | 显示所有头部信息(等效于 -h -l -S) | 快速概览文件结构 |
示例:
readelf -h a.out # 查看 ELF 头部 readelf -l a.out # 查看段表
2. 符号与重定位信息
| 选项 | 说明 | 典型用途 |
|---|---|---|
-s--symbols--syms | 显示符号表(Symbol Table) | 查找函数/变量地址 |
--dyn-syms | 显示动态符号表(Dynamic Symbol Table) | 分析运行时依赖符号 |
-r--relocs | 显示重定位信息 | 检查链接时的地址修正 |
-d--dynamic | 显示动态段(Dynamic Section) | 查看依赖库、RPATH 等 |
示例:
readelf -s libc.so.6 # 查看 libc 符号表 readelf -d a.out # 查看动态依赖
3. 调试信息分析(DWARF)
| 选项 | 说明 | 重要子选项 |
|---|---|---|
-w[选项]--debug-dump[=选项] | 显示 DWARF 调试信息 | =info(符号信息)=frames(函数帧)=line(源码行号) |
--dwarf-depth=n | 限制 DWARF 信息深度(仅对 =info 有效) | n=0:显示所有(默认)n=2:仅显示 2 层嵌套 |
--dwarf-start=n | 从指定 DIE(Debugging Information Entry)开始打印 | 结合 --dwarf-depth 使用 |
关键区别:
=rawline:原始.debug_line字节码=decodedline:解析后的源码行号映射=frames:原始.debug_frame二进制=frames-interp:解析后的函数调用帧信息
示例:
readelf -w=info -dwarf-depth=2 a.out # 仅显示 2 层嵌套的符号信息 readelf -w=decodedline a.out # 显示可读的源码行号
4. 节内容查看(Hex/字符串)
| 选项 | 说明 | 用法示例 |
|---|---|---|
-x <name>--hex-dump=<name> | 以十六进制显示节内容 | readelf -x .text a.out |
-p <name>--string-dump=<name> | 以字符串形式显示节内容 | readelf -p .comment a.out |
-R <name>--relocated-dump=<name> | 重定位后的十六进制内容 | readelf -R .got a.out |
-z--decompress | 解压压缩的节(如 .zlib) | readelf -z -x .debug_info a.out |
重要提示:
-x显示原始字节,-R显示重定位后的地址- 节名可为
名称(如.text)或索引(如1)
5. 其他实用选项
| 选项 | 说明 | 场景 |
|---|---|---|
-a--all | 等效于 -h -l -S -s -r -d -n -V | 查看文件所有信息(输出量大) |
-g--section-groups | 显示节组(Section Groups) | 用于特定架构(如 ARM) |
-V--version-info | 显示版本信息(如 GLIBC_2.3) | 分析库兼容性 |
-n--notes | 显示 NOTE 段(如编译器信息) | 检查构建环境 |
-u--unwind | 显示 unwind 表(IA64/ARM) | 分析异常处理 |
-c--archive-index | 显示归档文件(.a)的索引 | 替代 ar t |
-I--histogram | 显示符号表桶长度分布 | 优化符号表性能 |
-W--wide | 不截断输出(默认 80 列) | 在宽屏终端查看完整信息 |
-v--version | 显示 readelf 版本 | 验证工具版本 |
-H--help | 显示帮助信息 | 快速查阅选项 |
典型使用场景
1. 快速查看文件类型
readelf -h a.out | grep -E "Type|Machine"
# 输出示例:
# Type: EXEC (Executable file)
# Machine: Advanced Micro Devices X86-64
2. 分析依赖库
readelf -d a.out | grep -E "NEEDED|RPATH"
# 输出示例:
# 0x000000000000000f (RPATH) Library rpath: [/usr/local/lib]
# 0x000000000000000a (SONAME) Library soname: [libm.so.6]
3. 定位函数地址
readelf -s a.out | grep "printf"
# 输出示例:
# 12: 00000000004005a0 22 FUNC GLOBAL DEFAULT 13 printf
4. 分析调试信息(DWARF)
readelf -w=info -dwarf-depth=1 a.out # 仅显示函数定义(不深入内部)
5. 查看压缩的调试信息
readelf -z -x .debug_info a.out # 解压后查看 .debug_info 节
高级技巧
1. 从归档文件(.a)提取符号
readelf -c libmath.a # 显示 libmath.a 的符号索引
2. 重定位后查看 GOT 表
readelf -R .got a.out # 查看重定位后的全局偏移表
3. 仅查看特定节的字符串
readelf -p .comment a.out # 提取 .comment 节的字符串
注意事项(Critical Notes)
-
32/64位文件支持:
readelf自动识别文件位数,无需额外参数。 -
-x与-R的区别:-x:显示原始节内容(未重定位)-R:显示重定位后的节内容(如.got表中的实际地址)
-
DWARF 选项组合:
--dwarf-depth和--dwarf-start仅对=info有效=rawline和=decodedline不能同时使用
-
超大文件处理:
- 用
-W避免输出截断(尤其 64 位文件的段表) - 用
--dwarf-depth限制 DWARF 信息量
- 用
-
压缩节处理:
-z仅对.debug_info等压缩节有效,普通节会直接显示。
退出状态(EXIT STATUS)
| 状态码 | 含义 |
|---|---|
0 | 命令成功执行 |
1 | 无效选项或文件错误 |
2 | 文件不是 ELF 格式 |
1901

被折叠的 条评论
为什么被折叠?



