ELF 文件(.o / .so / 可执行程序)在文件内部被切分成一块一块独立的区域,每一块就叫一个节区(section)。

每个节区有自己的类型、权限、大小、在文件里的偏移,其中会存储各自的内容,例如:.text 节区存放机器码,.bss 节区存放未初始化的全局变量,.rodata 节区存放只读数据。

节区的分类

节区可以分为以下几个类型:

类型 说明
PROGBITS(Program Bits,程序比特段) 在文件里真实占用字节,里面存有效二进制数据。加载的时候,加载器会把文件里这一块原样拷贝到内存。
NOBITS(No Bits,空比特段) 在文件里不占用字节,只是记录一个大小。加载时加载器会在虚拟内存里分配一块指定大小、初始化为0的内存。
STRTAB(String Table,字符串表) 存储字符串的节区,其中存的有符号名、节名的字符串,当 SYMTAB、节表头需要的时候,只需要通过字符串表里的下标既可获得对应的字符串
SYMTAB(Symbol Table,符号表) 存储符号的节区,本质是符号条目的数组,每个条目里记录一个符号的名字、类型、所在节区、地址、大小等信息
RELA / REL(Relocation,重定位表) 存储重定位条目的节区,记录了程序中需要在运行时进行地址重定位的信息。

关于重定位的详细内容,请参考 重定位。