基本结构如下所示:
+====================+
+ ELF header + // 包含了整个文件的基本属性,如:文件版本,目标机器型号,入口地址。
+====================+
+Program header table+ // 程序标头表是一组程序标头,它们定义了运行时程序的内存布局。对于.obj文件可选的
+====================+
+ .interp + // 可执行文件所需要的动态链接器的位置。
+--------------------+
+ .note.ABI-tag + // 用于声明ELF的预期运行时ABI。包括操作系统名称及其运行时版本。
+--------------------+
+ .note.gnu.build-id + // 表示唯一的构建ID位串。
+--------------------+
+ .gnu.hash + // 符号hash表。若段名是.hash,则使用的是SYSV hash,其比gnu hash性能差。
+--------------------+
+ .dynsym + // 动态符号表用来保存与动态链接相关的导入导出符号,不包括模块内部的符号。
+--------------------+
+ .dynstr + // 动态符号字符串表,用于保存符号名的字符串表。静态链接时为.strtab。
+--------------------+
+ .gnu.version + // 表中条目与.dynsym动态符号表相同。每个条目指定了相应动态符号定义或版本要求。
+--------------------+
+ .gnu.version_r + // 版本定义。
+--------------------+
+ .rela.dyn + // 包含共享库(PLT除外)所有部分的RELA类型重定位信息。
+--------------------+
+ .rela.plt + // 包含共享库或动态链接的应用程序的PLT节的RELA类型重定位信息。
+--------------------+
+ .init + // 程序初始化段。
+--------------------+
+ .plt + // 过程链接表(Procedure Linkage Table),用来实现延迟绑定。
+--------------------+
+ .plt.got + // 暂无。。。。。
+--------------------+
+ .text + // 代码段
+--------------------+
+ .fini + // 程序结束段
+--------------------+
+ .rodata + // 只读变量(const修饰的)和字符串变量。
+--------------------+
+ .rodata1 + // 据我所知,.rodata和.rodata1是相同的。一些编译器会.rodata分为2个部分。
+--------------------+
+ .eh_frame_hdr + // 包含指针和二分查找表,(一般在C++)运行时可以有效地从eh_frame中检索信息。
+--------------------+
+ .eh_frame + // 它包含异常解除和源语言信息。此部分中每个条目都由单个CFI(呼叫帧信息)表示。
+--------------------+
+ .init_array + // 包含指针指向了一些初始化代码。初始化代码一般是在main函数之前执行的。
+--------------------+
+ .fini_array + // 包含指针指向了一些结束代码。结束代码一般是在main函数之后执行的。
+--------------------+
+ .dynamic + // 保存动态链接器所需的基本信息。
+--------------------+
+ .got + // 全局偏移表,存放所有对于外部变量引用的地址。
+--------------------+
+ .got.plt + // 保存所有对于外部函数引用的地址。延迟绑定主要使用.got.plt表。
+--------------------+
+ .data + // 全局变量和静态局部变量。
+--------------------+
+ .data1 + // 据我所知,.data和.data1是相同的。一些编译器会.data分为2个部分。
+--------------------+
+ .bss + // 未初始化的全局变量和局部局部变量。
+--------------------+
+ .comment + // 存放编译器版本信息
+--------------------+
+ .debug_aranges + // 内存地址和编译之间的映射
+--------------------+
+ .debug_info + // 包含DWARF调试信息项(DIE)的核心DWARF数据
+--------------------+
+ .debug_abbrev + // .debug_info部分中使用的缩写
+--------------------+
+ .debug_line + // 程序行号
+--------------------+
+ .debug_str + // .debug_info使用的字符串表
+--------------------+
+ .symtab + // 静态链接时的符号表,保存了所有关于该目标文件的符号的定义和引用。
+--------------------+
+ .strtab + // 默认字符串表。
+--------------------+
+ .shstrtab + // 字符串表。
+====================+
+Section header table+ // 用于引用Sections的位置和大小,并且主要用于链接和调试目的。对于Exec文件可选
+====================+