Linux系统之readelf 命令详解

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
解压压缩的节(如 .zlibreadelf -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)

  1. 32/64位文件支持
    readelf 自动识别文件位数,无需额外参数。

  2. -x-R 的区别

    • -x:显示原始节内容(未重定位)
    • -R:显示重定位后的节内容(如 .got 表中的实际地址)
  3. DWARF 选项组合

    • --dwarf-depth--dwarf-start 仅对 =info 有效
    • =rawline=decodedline 不能同时使用
  4. 超大文件处理

    • -W 避免输出截断(尤其 64 位文件的段表)
    • --dwarf-depth 限制 DWARF 信息量
  5. 压缩节处理
    -z 仅对 .debug_info 等压缩节有效,普通节会直接显示。

退出状态(EXIT STATUS)

状态码含义
0命令成功执行
1无效选项或文件错误
2文件不是 ELF 格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值