ELF文件由ELF头、程序头表、节头表及节与段组成,通过readelf、objdump、nm等工具可解析其结构,了解程序加载与符号解析机制。

Linux 下的可执行文件通常遵循 ELF(Executable and Linkable Format)格式,这是一种被广泛使用的二进制文件标准,适用于可执行文件、共享库、目标文件和核心转储。要分析 ELF 文件结构,需要了解其基本组成,并使用一系列工具进行解析。
ELF 文件基本结构
一个典型的 ELF 文件由以下几个关键部分组成:
- ELF 头(ELF Header):位于文件开头,描述整个文件的组织结构,包括文件类型(可执行、共享库等)、目标架构(如 x86_64)、程序头表和节头表的位置与数量。
- 程序头表(Program Header Table):列出运行时需要加载到内存的段(segments),如代码段(.text)、数据段(.data)。操作系统通过它来加载可执行文件。
- 节头表(Section Header Table):包含文件中各个节(sections)的信息,如 .text、.data、.bss、.symtab(符号表)、.strtab(字符串表)等,主要用于链接和调试。
- 节(Sections)和段(Segments):节是链接时的最小单位,段是运行时加载的单位。多个节可以合并到一个段中。
常用 ELF 分析工具
Linux 提供了多种命令行工具用于查看和解析 ELF 文件内容:
-
readelf:专门用于显示 ELF 文件详细信息。例如:
-
readelf -h显示 ELF 头信息。 -
readelf -l显示程序头表(段信息)。 -
readelf -S显示节头表(所有节的信息)。 -
readelf -s显示符号表。
-
-
objdump:功能更全面,可用于反汇编和查看节内容。
-
objdump -d反汇编可执行代码段。 -
objdump -x显示所有头部信息(类似 readelf 的综合输出)。
-
-
nm:列出目标文件中的符号。
-
nm显示符号及其类型(T 表示函数,D 表示初始化数据,B 表示未初始化数据等)。
-
-
file:快速判断文件类型。
-
file输出如 "ELF 64-bit LSB executable, x86-64" 等信息。
-
-
hexdump / xxd:查看文件的原始字节。
-
xxd查看文件前几行的十六进制表示,可用于观察 ELF 魔数(前4字节为 7f 45 4c 46)。| head
-
动手解析一个 ELF 可执行文件
以一个简单的 C 程序编译出的可执行文件为例:
hello.c#includeint main() { printf("Hello, ELF!\n"); return 0; }
编译:gcc -o hello hello.c
使用 readelf 查看 ELF 头:readelf -h hello
输出会显示 Magic 字样(7f 45 4c 46)、Class(ELF32 或 ELF64)、Data 编码方式、版本、类型(EXEC 可执行)、机器架构(如 x86-64)、入口地址(Entry point address)、程序头表偏移、节头表偏移等。
再查看段信息:readelf -l hello
可以看到 LOAD 段的虚拟地址、物理地址、文件偏移、大小、权限等,这些决定了程序如何被加载进内存。
可以实现用户的在线注册、登陆后可以添加图书、购买图书,可以对图书类别、出版社、价格等进行饼图分析默认帐号/密码:51aspx/51aspx该系统采用三层接口开发,App_Code下为三层结构的代码文件,适合三层入门者学习使用数据绑定控件使用的是GridView,顶部公用文件采用了UserControl用户控件调用DB_51aspx下为Sql数据库文件,附件即可【该源码由51aspx提供】
查看节信息:readelf -S hello
可以看到 .text(代码)、.data(已初始化数据)、.rodata(只读数据)、.symtab(符号表)、.strtab(字符串表)等节的位置和大小。
理解动态链接与符号解析
大多数可执行文件依赖共享库(如 libc)。可通过以下命令查看动态依赖:
-
ldd hello显示程序所依赖的共享库。 -
readelf -d hello查看动态段(.dynamic),其中包含 NEEDED 库名、重定位表位置、符号表索引等。
若程序使用了动态符号,符号解析会在运行时由动态链接器(/lib64/ld-linux-x86-64.so.2)完成。
基本上就这些。掌握 ELF 结构有助于理解程序加载、调试崩溃、逆向分析和安全防护。工具组合使用能深入挖掘二进制细节,是系统编程和安全研究的基础技能。









