ELF文件格式(3):符号管理
前言
符号是程序对某些类型的数据或者代码的引用,典型的符号包括全局变量、函数名等,这些符号会在程序链接、运行以及调试时发挥作用。ELF文件中管理的符号包括:
- 定义在本目标文件中并且可以被其它目标文件引用的全局符号,对应于C程序中非静态的函数和全局变量;
- 定义在其它目标文件中并且在本目标文件中引用的全局符号,这些符号称为外部符号,对应于C程序中在其它目标文件中定义的非静态函数和全局变量;
- 只在当前目标文件定义和引用的局部符号,对应C程序中的静态函数和静态全局变量;
- 节名,由编译器产生,用于记录该节的起始地址,如
.text、.data等。
符号表
ELF文件通常会使用独立的符号表记录所有引用到的符号,对应的节名为.symtab。ELF符号表保存了ELF文件中定义的全局变量和函数的符号信息,也包含了引用自外部文件的全局符号。在Linux下,可以使用readelf工具查看ELF文件符号表:

符号表本质上是一个由符号描述信息构成的数组,对于每个符号描述信息的数据结构定义如下:
typedef struct {
uint32_t st_name; /* 符号名,包含符号在字符串表中的下标信息 */
unsigned char st_info; /* 符号类型和绑定信息 */
unsigned char st_other; /* 未使用 */
uint16_t st_shndx; /* 符号所在节 */
Elf64_Addr st_value; /* 符号相对应的值,一般为符号地址 */
uint64_t st_size; /* 符号大小 */
} Elf64_Sym;
符号类型
ELF文件格式中定义的几种常用的符号类型如下:
- STT_NOTYPE:符号类型未定义;
- STT_FUNC:表示该符号符号是函数或者关联了其它可执行代码;
- STT_OBJECT:表示该符号是数据对象;
- STT_SECTION:表示该符号是一个节名,如.text节、.data节等;
- STT_FILE:表示该符号是文件名,如对于目标文件,通常是目标文件名。
符号绑定类型
根据符号的可见性和优先级,ELF定义了多种符号绑定类型,常见的符号绑定如下:
- STB_LOCAL:本地符号,对于目标文件之外是不可见的,如static函数;
- STB_GLOBAL:全局符号,对于所有需要链接的目标文件来说是可见的。一个全局符号在一个文件中进行定义后,另外一个文件可以对这个符号进行引用;
- STB_WEAK:弱引用符号,类似于全局符号,但优先级比STB_GLOBAL低。被标记为STB_WEAK的符号有可能被同名的未被标记为STB_WEAK的符号覆盖。
符号所在节
符号表项中成员st_shndx记录了符号所在节的信息,若符号定义在当前目标文件中,这个成员记录符号所在的节在节区头部表中的索引;但若符号定义在其它目标文件中,或者一些特殊符号,这个成员记录了一些特殊的符号常量:
- SHN_ABS:表示该符号包含了一个绝对的值,如表示文件名的符号;
- SHN_UNDEF:表示未定义的符号,即在当前目标文件中,但是定义在其它目标文件中的符号;
- SHN_COMMON:表示还未被分配位置的未初始化的符号,如未初始化的全局变量。这里可以注意与
.bss进行对比,.bss通常存储未初始化的静态变量,以及初始化为0的全局或静态变量。
动态符号表
在大多数动态链接可执行文件以及共享库中,还存在另外一张符号表,称作动态符号表,对应的节名为.dynsym。与符号表保存了文件中所有的符号信息不同,动态符号表只保存了引用自外部文件的全局符号,因此动态符号表中存储的符号实际上是符号表中的符号的一个子集,并且二者的作用也不相同:
.symtab符号表只是用来进行链接和调试的,因此只在可重定位文件进行链接时,需要symtab符号表中的内容,对于程序的运行则不是必要的数据,也不会被装载到内存中;.dynsym符号表保存的符号只能在运行时被解析,因此程序运行时会将.dynsym符号表加载到内存中。
清除符号信息
默认情况下编译出来的ELF文件里面带有符号信息和调试信息,这些信息在调试阶段很有用,但通常不是程序运行时必要的信息,因此在编译时,可以使用gcc的-s选项选择不生成符号信息,以减小生成文件占用的空间:
Aspiresky ~ # gcc -s main.c -o a.out
这里需要注意,对于可重定位文件的链接,需要符号表中的相关信息,因此在编译生成可重定位文件时,使用-s选项是不生效的。对于已编译生成的可执行文件,GNU binutils工具集中提供了strip工具,用于清除文件的所有符号和调试信息:
Aspiresky ~ # strip a.out
相关参考
- 《程序员的自我修养—链接、装载与库》
- 《Linux二进制分析》

浙公网安备 33010602011771号