符号表和重定位表是二进制文件格式(如 ELF、PE、Mach-O 等)的一部分,存储在文件的特定部分。不同的二进制文件格式有不同的结构和组织方式,但一般来说,符号表和重定位表都是这些文件格式的关键组成部分。以下是这些表在常见二进制文件格式中的存储位置:
ELF(Executable and Linkable Format)
在 ELF 文件中,符号表和重定位表是 ELF 文件头的一部分,并有各自的段(section)。
符号表
- 符号表存储在
.symtab
或.dynsym
段中。 .symtab
是静态符号表,包含所有符号信息,包括调试信息。.dynsym
是动态符号表,仅包含在动态链接期间使用的符号。
重定位表
- 重定位表存储在
.rel.text
、.rel.data
等段中。 .rela.text
和.rela.data
分别包含需要重定位的代码段和数据段的地址信息。
ELF 文件结构示意图
+------------------+
| ELF Header |
+------------------+
| Program Header |
+------------------+
| .text Section |
+------------------+
| .data Section |
+------------------+
| .symtab Section |
+------------------+
| .rel.text Section|
+------------------+
| ... |
+------------------+
PE(Portable Executable)
在 PE 文件中,符号表和重定位表也是文件头的一部分,并有各自的段。
符号表
- 符号表存储在 COFF 符号表部分(通常位于 PE 文件末尾)。
- 符号表包含每个符号的名称、值、类型、存储类和其他信息。
重定位表
- 重定位表存储在
.reloc
段中。 .reloc
段包含重定位信息,用于在加载时调整地址。
PE 文件结构示意图
+------------------+
| DOS Header |
+------------------+
| PE Header |
+------------------+
| Section Headers |
+------------------+
| .text Section |
+------------------+
| .data Section |
+------------------+
| .reloc Section |
+------------------+
| ... |
+------------------+
| COFF Symbol Table|
+------------------+
Mach-O
在 Mach-O 文件中,符号表和重定位表也是文件头的一部分,并有各自的段。
符号表
- 符号表存储在
LC_SYMTAB
加载命令指定的位置。 - 符号表包含符号名称、地址、类型等信息。
重定位表
- 重定位表存储在
LC_DYSYMTAB
加载命令指定的位置。 - 重定位表包含重定位信息,用于在加载时调整地址。
Mach-O 文件结构示意图
+------------------+
| Mach-O Header |
+------------------+
| Load Commands |
+------------------+
| .text Section |
+------------------+
| .data Section |
+------------------+
| Symbol Table |
+------------------+
| Relocation Table |
+------------------+
| ... |
+------------------+
总结
- ELF 文件:符号表存储在
.symtab
或.dynsym
段,重定位表存储在.rel.text
、.rel.data
等段。 - PE 文件:符号表存储在 COFF 符号表部分,重定位表存储在
.reloc
段。 - Mach-O 文件:符号表存储在
LC_SYMTAB
指定的位置,重定位表存储在LC_DYSYMTAB
指定的位置。
这些表在程序的加载和执行过程中发挥关键作用,确保符号的正确解析和地址的正确调整。