ELF文件中的特殊节汇总

+以下内容摘抄自:ELF文件系列第三篇ELF文件静态结构中的节

+【附声明和链接如下】

版权声明:本文为CSDN博主「广敏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011298001/java/article/details/84862565


在 ELF 文件中有一些特定的节是预定义好的,其内容是指令代码或者控制信息,这些节专门为操作系统使用。在构建可执行程序时,连接器(linker)可能需要把一些独立的目标文件和库文件连接在一起,在这个过程中,连接器要解析各个文件中的相互引用,调整某些目标文件中的绝对引用,并重定位指令码。每种操作系统都有自己的一套连接模型,但总的来说,不外乎静态和动态两类:

静态链接所有的目标文件和库被静态地绑定在一起,所有的符号都被解析出来。所创建的目标文件是完整的,运行时不依赖于任何外部的库。

动态链接:所有的目标文件、系统共享资源以及共享库以动态的形式连在一起,外部库的内容没有完整地拷贝进来。如果创建的是可执行文件的话,程序在运行的时候,构建时所依赖的那些库必须在系统中能找到,把它们一并load之后,程序才能运行起来。运行期间如何解析那些动态链接进来的符号引用,不同系统有各自不同的方式。

动态链接过程所需要的信息由.dynsym、.dynstr、.interp、.hash、.dynamic、.rel、.rela、.got、.plt 等节提供。.init 和.fini 节用于进程的初始化和终止过程。

特殊节汇总表:

名字 类型 属性 备注
.bss SHT_NOBITS SHF_ALLOC+SHF_WRITE 包含未初始化的全局变量。可执行程序在开始运行的时候,系统会把这一段内容清零。但是,在运行期间的bss段是由系统初始化而成的,在ELF文件中.bss节并不包含任何内容,其长度为0,所以类型为SHT_NOBITS。
.comment SHT_PROGBITS   包含版本控制信息。 

.data

.data1

SHT_PROGBITS SHF_ALLOC+SHF_WRITE 这两个节用于存放程序中被初始化过的全局变量。在ELF文件中,占用实际的存储位置,与.bss节不同。 
.debug SHT_PROGBITS   调试信息,内容格式没有统一规定。 
.dynamic SHT_DYNAMIC SHF_ALLOC+[SHF_WRITE] 包含动态链接信息。 
.dynstr SHT_STRTAB SHF_ALLOC 包含用于动态链接的字符串,一般是那些与符号表相关的名字。 
.dynsym SHT_SYNSYM SHF_ALLOC 包含动态链接符号表。 
.fini SHT_PROGBITS SHF_ALLOC+SHF_EXECINSTR 包含进程终止时要执行的程序指令。当程序正常退出时,系统会执行这一节中的代码。
.got SHT_PROGBITS SHF_ALLOC+SHF_WRITE 包含全局偏移量表。 
.hash SHT_HASH SHF_ALLOC 包含一张符号哈希表。 
.init SHT_PROGBITS SHF_ALLOC+SHF_EXECINSTR 包含进程初始化时要执行的程序指令。当程序开始运行时,系统会在进入主函数之前执行这一节中的代码。 
.interp SHT_PROGBITS [SHF_ALLOC] 包含ELF程序解析器的路径名。 
.line SHT_PROGBITS   用于调试的节,包含那些调试符号的行号,为程序指令码与源文件的行号建立起联系。内容格式没有统一的规定。 
.note SHT_NOTE   注释节详细描述。 
.plt SHT_PROGBITS SHF_ALLOC+SHF_EXECINSTR 包含函数链接表。 

.relname

.relaname

SHT_REL

SHT_RELA

[SHF_ALLOC] 包含重定位信息。这两个节名字中“name”是可替换的部分,按照惯例,对哪一节做重定位,就把“name”换成哪一节的名字。比如.text节的重定位节名是.rel.text或.rela.text。

.rodata

.rodata1

SHT_PROGBITS SHF_ALLOC 包含程序中的只读数据,在程序装载时,它们一般会被装入进程空间中那些只读的段中去。 
.shstrtab SHT_STRTAB   节名字表,包含所有节的名字字符串。 
.strtab SHT_STRTAB [SHF_ALLOC] 存放字符串表,主要是那些符号表项的名字。 
.symtab SHT_SYMTAB [SHF_ALLOC] 存放符号表。 
.text SHT_PROGBITS SHF_ALLOC+SHF_EXECINSTR 包含程序指令代码。 

以点号“.”为前缀的节名字是为系统保留的。应用程序也可以构造自己的段,但最好不要取与上述系统已定义的节相同的名字,也不要取以点号开头的名字,以避免潜在的冲突。注意,目标文件中节的名字并不具有唯一性,可以存在多个相同名字的节。

猜你喜欢

转载自www.cnblogs.com/from-zero/p/12875422.html