温馨提示×

怎样用readelf分析elf文件

小樊
38
2026-10-09 08:50:16
栏目: 编程语言

readelf 是 GNU binutils 中用于查看 ELF(Executable and Linkable Format)文件结构的命令行工具,常用于分析可执行文件、目标文件(.o)、共享库(.so)等。

下面从基本用法 → 常用选项 → 实战示例系统讲一遍。


一、基本语法

readelf [选项] elf文件

常见文件类型:

  • 可执行文件:a.out
  • 目标文件:test.o
  • 动态库:libxxx.so

二、最常用选项详解

1️⃣ 查看 ELF 文件头(最重要)

readelf -h file

或

readelf --file-header file

能看到什么:

  • ELF 类型(REL / EXEC / DYN)
  • 架构(x86 / x86-64 / ARM)
  • 入口地址(entry point)
  • 程序头 / 节头数量

示例输出关键字段:

Type:                              EXEC (Executable file)
Machine:                           Advanced Micro Devices X86-64
Entry point address:               0x401000

2️⃣ 查看节区(Section)信息

readelf -S file

或

readelf --sections file

用途:

  • 查看 .text、.data、.bss、.rodata
  • 分析符号表、调试信息位置

3️⃣ 查看程序头(Program Header)

readelf -l file

或

readelf --program-headers file

用途:

  • 分析加载到内存的段(LOAD、INTERP、DYNAMIC)
  • 理解进程内存布局

4️⃣ 查看符号表(Symbol Table)

readelf -s file

或

readelf --symbols file

用途:

  • 查看函数名、变量名
  • 分析未定义符号(U 类型)

5️⃣ 查看动态符号表(用于 .so)

readelf --dyn-syms file

常用于:

  • 分析动态库导出函数
  • 排查 undefined symbol 问题

6️⃣ 查看依赖的共享库

readelf -d file

或

readelf --dynamic file

常见信息:

(NEEDED) Shared library: [libc.so.6]
(SONAME) Library soname: [libtest.so]

7️⃣ 查看重定位信息

readelf -r file

用途:

  • 分析链接过程
  • 理解 PIC(位置无关代码)

8️⃣ 查看调试信息(是否有 -g)

readelf -S file | grep debug

或

readelf --debug-dump=info file

三、实战示例

示例 1:判断文件类型

readelf -h a.out | grep Type
  • EXEC:可执行文件
  • DYN:共享库 / PIE 可执行文件
  • REL:目标文件

示例 2:分析未定义函数

readelf -s test.o | grep UND

示例 3:查看程序加载段

readelf -l a.out

关注:

  • LOAD 段
  • INTERP(动态链接器路径)

示例 4:对比静态 / 动态链接

readelf -d a.out
  • 有 NEEDED → 动态链接
  • 没有 → 静态链接

四、readelf vs objdump

工具 特点
readelf 专注于 ELF 结构
objdump 更偏反汇编

常用组合:

readelf -h file
objdump -d file

五、小结

✅ 分析 ELF 文件的标准流程:

  1. readelf -h → 文件类型
  2. readelf -l → 内存布局
  3. readelf -S → 节区
  4. readelf -s → 符号
  5. readelf -d → 动态依赖

如果你有具体文件或报错场景(比如符号找不到、PIE、ARM、stripped 文件),可以直接发出来,我可以一步步帮你分析。

0 踩