如图1所示,在审视一个目标文件时,有两种视角可供选择,一种是链接视角,通过节(Section)来进行划分;另一种是运行视角,通过段(Segment)来进行划分。这里我们先讲解链接视角,通常目标文件都会包含代码(.text)、数据(.data)和BSS(.bss)三个节。其中代码节用于保存可执行的机器指令,数据节用于保存已初始...
在这里引入这张图,主要为了引出两个重要的概念节(Seciton)和段(Segment)。由上图可以发现,链接视图有大量的节(Section),而执行视图有段(Segment)。那么什么是段,什么又是节? 2.3 节(Section) Vs. 段(Segment) 或许我们听说过bss段,text(代码)段,或者data(数据)段,但其实我们口头交流的段更多是泛化的段。为什...
而右边的ELF的执行视图,则可以理解为可执行的文件内容布局。链接视图由sections组成,而可执行的文件的内容由segment组成。 两者是有一些区别的,我们平时在进行程序构建的时候理解的.text、.bss、.data段,这些都是section,也就节区的概念。这些段通过section header table进行组织与重定位。 但是对于segment来说,程序代...
下面是一些常见的segment类型(p_type中保存着segment的类型): PT_LOAD:表示一个需要被加载到内存中的程序段。这是最常见的段类型,通常包括可执行文件的.text、.data等部分。 PT_DYNAMIC:包含动态链接的信息,用于动态链接器解析和处理动态链接库。 PT_INTERP:指定程序运行时需要的解释器路径,通常用于动态链接的可执行...
一般目标文件将这些信息按照不同的属性,以段(segment)的形式存储。 代码段(.text):源代码编译过后的机器指令。 数据段(.data):全局变量和局部静态变量被放在数据段。 只读数据段(.rodata):const 修饰的变量和其他字符串常量。 bss 段:为未初始化的符号,预留足够的空间。未初始化的变量在 bss 段。
2.1一般目标文件将符号表、调试信息、字符串等一些链接时所须要的信息,以“节”(Section)的形式存储,有时候也叫“段”(Segment),通常不加区别。 -代码段(Code Section):存放源代码编译后的机器指令 代码段常见的名字:".code" ".text" -数据段(Data Section) : 存放全局变量和局部静态变量 ...
接下来就是执行视图:其主要不同点就在于没有了section,而有了多个segment。其实这里的segment大都是来源于链接视图中的section 数据形式:ELF文件格式支持8位/32位体系结构。当然,这种格式是可以扩展的,也可以支持更小或者更大位数的处理器架构,因此,目标文件还应该包含一些控制数据,这部分数据表明了目标文件所使用的架...
bss段 bss段(bss segment) 用于存放程序中 未经初始化的全局变量和静态局部变量 。在目标文件中,这个段并不占据实际空间,它仅仅只是一个占位符。 bss段属于 静态内存分配 。 data段 数据段(data segment) 通常是指用来存放程序中 已初始化的全局变量和静态局部变量
链接器在处理目标文件时,需要对目标文件中的某些部位进行重定位,即代码段和数据中中那些绝对地址引用的位置。对于每个需要重定位的代码段或数据段,都会有一个相应的重定位表。比如”.rel.text”就是针对”.text”的重定位表,”.rel.data”就是针对”.data”的重定位表。
ELF文件包含一个Header描述文件的基本信息;程序头表告诉徐彤如何构建进程的内存镜像,因此只有可执行文件由程序头表;Sections描述了链接过程中的需要的符号表、数据、指令等信息,而在可执行文件中是Segments,是经过合并的Secitons;节/段头表指明了对应section/segment在文件中的偏移,链接阶段的ELF文件必须包含该表...