每个 可重定位 目标模块 m 都有一个符号表,它包含 m 定义和引用的符号的信息
- 符号表是一个结构体的数组
- 每个条目包括符号的名称、大小和位置
- 符号表是由汇编器构造的,使用编译器输出到汇编语言 .s 文件中的符号
- 每个.o 文件都维护了自己的符号表
认识到本地链接器符号和本地程序变量不同是很重要的。.symtab 中的符号表不包含对应于本地非静态程序变量的任何符号。这些符号在运行时在栈中被管理,链接器对此类符号不感兴趣
以下是一个结构体的数组形式的符号表
typedef struct {
int name; /* String table offset */
char type:4, /* Function or data (4 bits) */
binding:4; /* Local or global (4 bits) */
char reserved; /* Unused */
short section; /* Section header index */
long value; /* Section offset or absolute address */
long size; /* Object size in bytes */
} Elf64_Symbol;- name 是字符串表中的字节偏移
- 指向符号的以 null 结尾的字符串名字
- value 是符号的地址
- 对于可重定位的模块来说,value 是距定义目标的节的起始位置的偏移.
- 对于可执行目标文件来说,该值是一个绝对运行时地址
- size 是目标的大小(以字节为单位)
- type 通常要么是数据,要么是函数
- 符号表还可以包含各个节的条目,以及对应原始源文件的路径名的条目
- inding 字段表示符号是本地的还是全局的