ELF节的分类
.text节
.text
节是保存了程序代码指令的代码节。一段可执行程序,如果存在Phdr,则.text节就会存在于text段中。由于.text
节保存了程序代码,所以节类型为SHT_PROGBITS
。
.rodata节
rodata
节保存了只读的数据,如一行C语言代码中的字符串。由于.rodata
节是只读的,所以只能存在于一个可执行文件的只读段中。因此,只能在text
段(不是data
段)中找到.rodata
节。由于.rodata
节是只读的,所以节类型为SHT_PROGBITS
。
.plt节(过程链接表)
.plt
节也称为过程链接表(Procedure Linkage Table),其包含了动态链接器调用从共享库导入的函数所必需的相关代码。由于.plt
节保存了代码,所以节类型为SHT_PROGBITS
。
.data节
.data
节存在于data
段中,其保存了初始化的全局变量等数据。由于.data
节保存了程序的变量数据,所以节类型为SHT_PROGBITS
。
.bss节
.bss
节存在于data
段中,占用空间不超过4字节,仅表示这个节本省的空间。.bss节保存了未进行初始化的全局数据。程序加载时数据被初始化为0,在程序执行期间可以进行赋值。由于.bss
节未保存实际的数据,所以节类型为SHT_NOBITS
。
.got.plt节(全局偏移表-过程链接表)
.got
节保存了全局偏移表。.got节和.plt节一起提供了对导入的共享库函数的访问入口,由动态链接器在运行时进行修改。由于.got.plt
节与程序执行有关,所以节类型为SHT_PROGBITS
。
.dynsym节(动态链接符号表)
.dynsym
节保存在text
段中。其保存了从共享库导入的动态符号表。节类型为SHT_DYNSYM
。
.dynstr节(动态链接字符串表)
.dynstr
保存了动态链接字符串表,表中存放了一系列字符串,这些字符串代表了符号名称,以空字符作为终止符。
.rel.*节(重定位表)
重定位表保存了重定位相关的信息,这些信息描述了如何在链接或运行时,对ELF目标文件的某部分或者进程镜像进行补充或修改。由于重定位表保存了重定位相关的数据,所以节类型为SHT_REL
。
.hash节
.hash
节也称为.gnu.hash
,其保存了一个用于查找符号的散列表。
.symtab节(符号表)
.symtab
节是一个ElfN_Sym
的数组,保存了符号信息。节类型为SHT_SYMTAB
。
.strtab节(字符串表)
.strtab
节保存的是符号字符串表,表中的内容会被.symtab
的ElfN_Sym
结构中的st_name
引用。节类型为SHT_STRTAB
。
.ctors节和.dtors节
.ctors
(构造器)节和.dtors
(析构器)节分别保存了指向构造函数和析构函数的函数指针,构造函数是在main函数执行之前需要执行的代码;析构函数是在main函数之后需要执行的代码。
关于符号表的两种说明
符号是对某些类型的数据或代码(如全局变量或函数)的符号引用,函数名或变量名就是符号名。
Tips:.dynsym保存了引用来自外部文件符号的全局符号。如printf
库函数。.dynsym保存的符号是.symtab所保存符合的子集,.symtab中还保存了可执行文件的本地符号。如全局变量,代码中定义的本地函数等。
![](https://img.haomeiwen.com/i16382957/cf6767910b9a2556.jpg)
ALLOC表示有该标记的节会在运行时分配并装载进入内存,而.symtab
不是在运行时必需的,因此不会被装载到内存中。.dynsym保存的符号只能在运行时被解析,因此是运行时动态链接器所需的唯一符号。.dynsym
对于动态链接可执行文件的执行是必需的,而.symtab
只是用来进行调试和链接的。
网友评论