关于可重定位目标文件的格式与其符号表的概述

        我们知道一个可执行的C程序要经过语言预处理、编译器、汇编器生成扩展名为.o的可重定位目标文件,再通过链接器链接生成可执行的目标文件。

1.什么是可重定位目标文件

       一个扩展名为.s 的ASCII汇编语言文件经由汇编器翻译成一个包含二进制代码和数据的.o文件,即可重定位目标文件。其特点是可在编译时与其它可重定位目标文件合并起来,由此创建一个可执行目标文件。

2.可重定位目标文件格式

  (这里讨论的是现代X86-64Linux和 Unix系统使用的ELF格式)

       前四个节图中已作出解释,(ps:其中.data中放入已初始化的全局变量和静态C变量;.bss中放入未初始化的全局和静态C变量)现解释其余的节中存的信息:

  • .symtab  一个符号表,存放程序中定义和引用的函数和全局变量的信息。
  • .rel.text  一个.text节中位置的列表,当链接器把这个目标文件和其它文件组合是,需要修改这些位置。
  • rel.data  被模块引用或定义的所有全局变量的定位信息。
  • .debug 一个调试符号表,其条目是程序中定义的局部变量和类型定义,程序中定义和引用的全局变量,以及原始的C源文件。
  • .line 原始C源程序中的行号和.text节中机器指令之间的映射。
  • .strtab 一个字符串表,其内容包括.symtab节和.debug节中的符号表以及节头部中的节名字。

    下面看一个例子:

   

   输入命令:readelf -s main.o 查看其符号表,即.symtab节中存放的信息

        value表示符号在节中的偏移量;Type表示该符号是函数还是数据;Bind表示该符号是全局的还是局部的;Ndx表示该符号位于节与ELF头节的偏移,如.text节的Ndx为1;

        例:静态局部变量al1的Num是7,描述为存放在.bss节中偏移量为4的占4个字节大小的符号。

      1. 同一个节中的字符存放遵循数据对齐的规则;如.data节中数组array放在该节的首地址,2个整型数占8个字节,紧跟字符a放在偏移量为8的位置,占1个字节,以初始化的局部静态变量cal存放在.data节中偏移为12的位置,因为int型对象的首地址必须是4的倍数;

      2.符号sum实际是一个函数的引用,由于此刻main.o与sum.o还没有进行链接,所以sum符号的类型还不能确定,只表示在不目标模块中引用但却在其它地方定义的符号。

     3.COMMON与.bss的区别:COMMON中放未初始化的全局变量

                                                 .bss中放的是未初始化的静态变量以及初始化为0的全局或静态变量

 

        再看看ELF头中的信息,ELF头中前16个字节的序列描述了生成了该文件的系统的字的大小和字节顺序,剩余的部分包含了帮助链接器语法分析和解释目标文件的信息。若要看ELF头中的信息则输入命令:readelf -h main.o

       在main.o中的ELF头中,前三个魔术7f454c定义了文件的类型为可重定位目标文件,节头部表的起始地址992(0x3e0),节条数量为13,大小是64字节。

 

       节头表中描述了不同节的位置和大小, 我们再看节头部表中的信息,输入命令:readelf  -S main.o

   

     由于已知ELF头为64字节大小、各节的偏移量和大小及节头部表的偏移和大小(节头数*节头大小=13*64Byte=832Byte),则可以画出ELF可重定位目标文件的结构图

      至此,可重定位目标文件的结构就已经简单叙述完毕,如有错误的地方,欢迎指出。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值