Content #
ELF文件中的符号表往往是文件中的一个段,段名一般叫“.symtab”。符号表的结构很简单,它是一个Elf32_Sym结构(32位ELF文件)的数组,每个Elf32_Sym 结构对应一个符号。这个数组的第一个元素,也就是下标0的元素为无效的“未定义”符号。Elf32_Sym的结构定义如下:
typedef struct {
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32_Half st_shndx;
} Elf32_Sym;
-
符号类型和绑定信息(st_info)该成员低4位表示符号的类型(Symbol Type),高4位表示符号绑定信息(Symbol Binding)。
-
符号所在段(st_shndx)如果符号定义在本目标文件中,那么这个成员表示符号所在的段在段表中的下标;但是如果符号不是定义在本目标文件中,或者对于有些特殊符号, sh_shndx的值有些特殊,如下表所示。
-
符号值(st_value)每个符号都有一个对应的值,如果这个符号是一个函数或变量的定义,那么符号的值就是这个函数或变量的地址,更准确地讲应该按下面这几种情况区别对待。
- 在目标文件中,如果是符号的定义并且该符号不是“COMMON块”类型的(即
st_shndx不为SHN_COMMON),则st_value表示该符号在段中的偏移。即符号所对应的函数或变量位于由st_shndx指定的段,偏移st_value的位置。这也是目标文件中定义全局变量的符号的最常见情况。
- 在目标文件中,如果符号是“COMMON块”类型的(即st_shndx为SHN_COMMON),
则st_value表示该符号的对齐属性。比如SimpleSection.o中的“global_uninit_var”。
- 在可执行文件中,st_value表示符号的虚拟地址。这个虚拟地址对于动态链接器来说十分有用。
From #
程序员的自我修养