每个 可重定位 目标模块 m 都有一个符号表,它包含 m 定义和引用的符号的信息

  • 符号表是一个结构体的数组
  • 每个条目包括符号的名称、大小和位置
  • 符号表是由汇编器构造的,使用编译器输出到汇编语言 .s 文件中的符号
  • 每个.o 文件都维护了自己的符号表

认识到本地链接器符号和本地程序变量不同是很重要的。.symtab 中的符号表不包含对应于本地非静态程序变量的任何符号。这些符号在运行时在栈中被管理,链接器对此类符号不感兴趣

深入理解计算机系统3, page 504

以下是一个结构体的数组形式的符号表

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 字段表示符号是本地的还是全局的