本文参考
【计算机那些事(4)——ELF文件结构 | 楚权的世界 (chuquan.me)】
【ELF文件结构 – 简书 (jianshu.com)】
有大量删改。
CONTENTS
目标文件的格式
目前,PC平台流行的 可执行文件格式(Executable) 主要包含如下两种,它们都是 COFF(Common File Format) 格式的变种。
- Windows下的 PE(Portable Executable)
- Linux下的 ELF(Executable Linkable Format)
目标文件就是源代码经过编译后但未进行连接的那些中间文件(Windows的.obj
和Linux的.o
),它与可执行文件的格式非常相似,所以一般跟可执行文件格式一起采用同一种格式存储。在Windows下采用PE-COFF文件格式;Linux下采用ELF文件格式。
事实上,除了可执行文件外,动态链接库(DDL,Dynamic Linking Library)、静态链接库(Static Linking Library) 均采用可执行文件格式存储。它们在Window下均按照PE-COFF格式存储;Linux下均按照ELF格式存储。只是文件名后缀不同而已。
- 动态链接库:Windows的
.dll
、Linux的.so
- 静态链接库:Windows的
.lib
、Linux的.a
下面,我们将以ELF文件为例进行介绍。
ELF文件结构
注意:段(Segment
)与节(Section
)的区别。很多地方对两者有所混淆。段是程序执行的必要组成,节是ELF链接的产物,当多个目标文件链接成一个可执行文件时,会将相同权限的节合并到一个段中。
如图所示,为ELF文件的基本结构,其主要由四部分组成:
- ELF Header
- ELF Program Header Table (或称Program Headers、程序头)
- ELF Section Header Table (或称Section Headers、节头表)
- ELF Sections
ELF文件类型
ELF文件主要有三种类型,可以通过ELF Header中的e_type
成员进行区分。
- 可重定位文件(Relocatable File):
ETL_REL
。一般为.o
文件。可以被链接成可执行文件或共享目标文件。静态链接库属于可重定位文件。 - 可执行文件(Executable File):
ET_EXEC
。可以直接执行的程序。 - 共享目标文件(Shared Object File):
ET_DYN
。一般为.so
文件。有两种情况可以使用。- 链接器将其与其他可重定位文件、共享目标文件链接成新的目标文件;
- 动态链接器将其与其他共享目标文件、结合一个可执行文件,创建进程映像。
ELF布局
elf文件有2种视图,如下图:
发表评论