ELF文件中的符号表往往是文件中的一个段,段名叫".strtab"。符号表的结构是由Elf32_Sym
结构体构成的数组,每个Elf32_Sym结构对应一个符号。数组的第一个元素,也就是下标
为0的元素为无效的“未定义”符号。
typedef struct {
Elf32_Word st_name; //该符号名在字符串表中的下标。
Elf32_Addr st_value; //符号相对应的值。
Elf32_Word st_size; //符号大小。对于包含数据的符号,这个值是该数据类型的大小
unsigned char st_info; //符号类型和绑定信息。
unsigned char st_other; //该成员目前为0,没用。
Elf32_Half st_shndx; //符号所在的段。
}Elf32_Sym;
符号类型和绑定信息(st_info)
该成员低4位表示符号的类型(Symbol Type),高28位表示符号绑定信息(Symbol Binding)。
符号绑定信息
STB_LOCAL 0 局部符号,对于目标文件的外部不可见
STB_GLOBAL 1 全局符号,外部可见
STB_WEAK 2 弱符号
符号类型信息
STT_NOTYPE 0 未知类型符号
STT_OBJECT 1 该符号是个数据对象,比如变量、数组等
STT_FUNC 2 该符号是个函数或者其他可执行代码
STT_SECTION 3 该符号表示一个段,这种符号必须是STB_LOCAL的
STT_FILE 4 该符号表示文件名,一般都是该目标文件所对应的源文件名,
它一定是STB_LOCAL类型的。
符号所在的段(st_shndx)
如果符号定义在本目标文件中,那么这个成员表示符号所在段在段表中的下标。如果符号
不是定义在本目标文件中,或者对于有些特殊符号,又如下所示的一些值:
符号所在段特殊常量
SHN_ABS 0xfff1 该符号包含了一个绝对值,比如表示文件名的符号。
SHN_COMMON 0xfff2 表示该符号是一个"COMMON块"的符号
SHN_UNDEF 0 该符号在本目标文件中被引用到,但是定义在其他目标文件中。
符号值(st_value)
如果这个符号是函数或者变量的定义,那么符号的值就是这个函数或者变量的地址,分为
一下几种情况:
1.在目标文件中,如果是符号的定义并且该符号不是"COMMON块"类型的,则st_value表示
该符号在段中的偏移,即符号所对应的函数或者变量位于由sh_shndx指定的段,偏移st_value
的位置,这也是目标文件中定义全局变量最长见的情况。
2.在目标文件中,如果符号是"COMMON块"类型的,则st_value表示该符号的对其属性。
3.在可执行文件中,st_value表示符号的虚拟地址。