目标文件ELF中的内容

1.目标文件格式简述

源文件经过编译器后生成目标文件,目标文件按照可执行文件的格式来存储,最初的可执行文件的格式为COFF,经过演变,现在的 windows下的可执行文件的格式为PE-COFF格式,而linux下的可执行文件的格式为ELF 格式。两种格式很类似。


2.目标文件内容简述

目标文件是以段的形式存储的。目标文件中包含了很多段,其中,程序源代码编译后的机器指令被放置在代码段(.text)中。初始化的全局变量和局部静态对象则放置在.data段中,未初始化的全局变量和局部静态变量则存放在.bss 段中。其中.BSS段比较特殊,我在先前的博客中讨论过了:点击打开链接

目标文件中最重要的两个部分:文件头与段表。文件头包含了描述整个文件的基本属性,如文件版本,目标机器型号等信息;而段表则描述了目标文件所包含的所有段的信息,比如每个段的段名,段的长度,段在文件中的偏移等。下面将分别说明目标文件中的几个重要组成部分


3.文件头

文件头中给出了整个文件的一些基本属性,其中能协助解析整个目标文件的两个信息分别是:段表偏移,段表字符串表在段表中的下标。

3.1 段表在文件中的偏移:

段表也是ELF文件中的一个段,该段记录了该文件所有段的结构信息。它是由一个结构体数组组成的,其中每个数组元素对应ELF文件中的一个段,我们称这个描述段的结构体为段描述符。段描述符给出了段的偏移位置,段的属性,段的大小等重要信息,有助于解析整个文件。


3.2 段表字符串表

段表字符串是一个字符串序列,只须给定字符串在该表中的偏移位置,就可以读取出该字符串,其中读取出的每个字符串对应一个段名。如“.text”,".data"等。


4.段表

刚刚上面说了段表是一个结构体数组,其中结构体的内容如下:

typedef struct
{
	Elf32_Word	sh_name;	//给出该结构体对应段表在段表字符串表中的偏移。可以通过该偏移获得该段的段名
	Elf32_Word	sh_type;	//指定该段是 无效段、程序段、无内容段、重定位段、符号表段 等类型
	Elf32_Word	sh_flags;	//指出该段的属性,是 可写段、可执行段、需要分配空间的段
	Elf32_Word	sh_addr;	//指出该段的虚拟地址
	Elf32_Word	sh_offset;	//指出该段在目标文件中的偏移
	Elf32_Word	sh_size;	//指出该段的大小
	Elf32_Word	sh_link;	//该标志对重定位表有用,指明该段所使用的符号表在段表中的下标
	Elf32_Word	sh_info;	//该标志对重定位表有用,指明该重定位段的作用段在段表中的下标,如:.text段在段表中的下标为1,则.ret.text段中该标志的值为1
	Elf32_Word	sh_addrlign;	//该符号表虚拟地址的对齐要求
	Elf32_Word	sh_entsize;	//若该段有固定项大小,则指定该大小
}

5.符号表

将函数与变量统称为符号,符号表是链接的接口,其记录了目标文件中所用到的所有符号。每个定义的符号有一个对应的值,叫做符号值,对于变量与函数而言,符号值就是它们的地址。符号可以分为以下几种:

1.全局符号(全局变量与函数),可以被其他文件引用

2.外部符号(在目标文件中引用却未定义的全局符号)

3.段名

4.局部符号

5.行号信息

符号表与段表类似,是一个结构体组成的数组,每个数组元素对应一个符号的信息,其中包含信息有:该符号名在符号表中的偏移(符号表与段符号表功能类似,记录了目标文件中的符号字符串);符号对应的值,即符号值;该符号对应的大小,如果是double型的符号,则该大小为8字节;符号类型(说明该符号是变量名还是函数名还是文件名等)与绑定信息(说明该符号是局部符号还是全局符号还是弱引用);符号所在的段(指明其所在段在段表中的下标)






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值