ELF文件类型

1.可执行文件(Executable File)[.exec]:经过链接的、可执行的目标文件,通常也称为程序。

2.可重定位文件(Relocatable File)(可重定位目标文件)[.rel]:由源代码编译生成,包含编译后的二进制代码和数据,但未完成链接过程,通常以”.o”作为扩展名。

3.共享目标文件(Shared Object file)[.dyn]:动态链接库文件。可被多个程序共享使用,在运行时加载到内存。

ELF 文件结构

ELF 文件通过特定的格式组织数据,主要结构包括:

1. ELF 文件头(ELF Header)

  • 位于文件起始位置,描述文件的基本属性。
  • 关键字段:
    • EI_MAGIC:文件魔数(如0x7F ELF),用于标识 ELF 格式。[7f 45 4c 46即字符串“\177ELF“]
    • EI_CLASS:位数(32 位或 64 位)。
    • EI_DATA:字节序(大端或小端)。
    • e_type:文件类型(可执行文件、共享库等)。
    • e_entry:程序入口地址。

2. 程序头表/段表(Program Header Table)

  • 描述文件在内存中的布局,用于加载器将文件映射到内存。
  • 关键字段:
    • p_type:段类型(如代码段、数据段、动态链接段)。
    • p_vaddr:内存虚拟地址。
    • p_filesz:文件中占用的大小。
    • p_memsz:内存中占用的大小。

3. 节头表(Section Header Table)

  • 描述文件中的各个 “节”(Section),用于链接器处理目标文件。
  • 常见节类型:
    • .text:可执行代码段。
    • .data:已初始化的全局变量和静态变量。
    • .bss:未初始化的全局变量和静态变量(运行时自动初始化为 0)。
    • .rodata:只读数据段(如字符串常量)。
    • .symtab:符号表,记录函数和变量的名称、地址等。
    • .strtab:字符串表,存储符号表中的字符串内容。

4. 节(Sections)

  • 具体存储代码、数据、元信息的区域,不同类型的 ELF 文件包含的节不同。
  • 示例:
    • 可执行文件:包含.text.data.dynamic(动态链接信息)等。
    • 目标文件:包含.text.rel.text(代码重定位信息)等。

image-20250629223418086

image-20250629223515561