目标文件结构介绍

        开发人员开发的代码,需要经过编译和链接两个过程,才能生成最终的可执行文件,或共享文件(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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值