目标文件结构介绍

来源:互联网 发布:淘宝手机端显示宝贝 编辑:程序博客网 时间:2024/06/05 05:20

        开发人员开发的代码,需要经过编译和链接两个过程,才能生成最终的可执行文件,或共享文件(Linux.sowindows.dll文件)。其中链接文件(或称为目标文件,在Linux下为.o,在windows下为.obj)是编译器编译后生成的文件。在链接时,链接器再将它链接成为可执行文件或共享文件等。

        目标文件的格式主要是Linux平台下的ELF(ExecutableLinkable Format)Windows平台的PE(Portable Executable)

        本文以ELF为例介绍目标文件。

        

       ELF文件的结构如上图,左右两侧分别为链接视角和执行视角,执行视角中,主要是将链接视角中的多个属性相同的Section(如.rodata.code都是只读)的Section作为一个Segment,以便在操作系统进程应用程序装载时,可以减少因按页分配(4KB每页)导致的内存浪费。

        本文主要是链接视角来研究ELF文件。

       1.      文件头:

               主要包括ELF魔数、硬件平台版本、入口地址、程序头入口和长度、段表的位置和长度及段的数量等。

               ELF魔数:每一种文件有一个固定的魔数,操作系统可以通过ELF魔数判断是否为正确的可执行文件,如果不正确,则拒绝执行;

               段表的位置和长度:链接器通过此信息获取段表的位置和长度信息

               段表字符串表的下标:段表字符串表的下标,通过此下标可以找到段表字符串表(此段中保存了段表中用到的字符串)

       2.      段表(Setion header tabls):

               描述ELF文件中每一个段的段名、类型、地址、长度、偏移、对齐要求等信息。

               这里的“段名”是一个数值,为段表字符串表中的偏移。段表字符串表也是一个段,里面保存了段表中用到的字符串。

       3.      段(Sections):

               ELF文件中有很多段,比较重要的为代码段、数据段、只读数据段、BSS段、重定位表、符号表等,

               1)      代码段

                       保存编译生成的机器指令序列

               2)      数据段

                       已初始化的全局变量

               3)      只读数据段

                       只读变量,编译器可能将只读全局变量放在.rodata段,而局部常量定义可能在编译期间将使用的代码替换为了值,除非有取地址操作,才在栈上分配空间。但这都取决于编译器。

               4)      BSS

                       未经初始化的全局变量和静态变量(未经初始化的全局变量可能放在BSS段,也可能不放,取决于编译器)。

               5)      重定位表

                       主要包括:需要重定位的指令地址、需要重定位的符号、以及类型。链接器根据指令地址找到需要重定位的内容,然后通过符号在符号表中找到对应符号的地址,然后再根据类型将此地址填写到指令中。

               6)      符号表

                      包括名称、值、大小、类型和绑定信息等。

                      名称:符号的名称

                      值:如果符号是一个函数或变量,则值是此函数或变量的地址

                      大小:符号占用的空间的大小

                      类型:包括局部符号、全局符号、弱符号。如果是局部符号,则不需要进行重定位;如果是全局符号或弱符号,则需要进行重定位操作;

                      绑定信息:可能的取值包括数据对象(变量、数据等)、函数、SECTIONFILE

 

原创粉丝点击