关于重定位目标文件解析的那些事(深入理解ELF)

本文深入解析了ELF(Executable and Linkable Format)文件格式,介绍了从源代码到可执行目标文件的过程,以及ELF的链接视图和执行视图。通过实例分析,详细解释了ELF头部信息、魔数、程序头表、节头表和符号表的作用。

ELF全称“Executable and Linkable Format”

即可执行可链接格式,也就是对可重定位目标文件进行解析的格式。

而我们知道从源代码到可执行目标文件一般要经历以下几个步骤:

main.c-----预处理(cpp)----->main.i------编译(ccl)----->main.s-----汇编(as)----->main.o-----链接(ld)----->main(可执行文件)

而可重定位目标文件是其中的.o文件,它包括二进制代码和数据,同时在编译时将所有的可重定位目标文件合并为可执行目标文件,由上文可知,每个.o文件是由对应的.c文件生成,且每个.o的数据和文件都是从0开始的。

接下来介绍ELF。
ELF有两种视图分别为链接视图和执行视图,对应不同的目标文件。

@ELF的链接视图(来自中国大学mooc南京大学袁春风老师的ppt):
在这里插入图片描述
对应可重定位的目标文件

@ELF的执行视图(来自中国大学mooc南京大学袁春风老师的ppt):
在这里插入图片描述
对应可执行的目标文件

现在通过ubantu跑几个程序加深理解

main.c:

/* main.c */
/* $begin main */
int sum(int *a, int n);

int array[2] = {1, 2};

int main() 
{
    int val = sum(array, 2);
    return val;
}
/* $end main */

在终端界面输入 readelf -h 可以看到如下信息,即ELF的头信息:
在这里插入图片描述
注意上面图片的Magic,其后的7f 45 4c 46是ELF的魔数,魔数就是文件开头几个字节通常用来确定文件的类型或格式的数,通常a.out的魔数是01H 07H,PE格式下为4DH 5AH。在加载或读取文件时,一般用魔数确定文件类型是否正确。

接着我们可以看到mian.o的类型是32位版本的,数据为补码是小端模式运行的,版本为1,操作系统是UNIX - System V,版本类型为REL(可重定位文件),机器为Intel 80386架构。

入口地址为0,也即是可重定位目标文件的地址为0。

程序头表偏移量为0,大小为0,表项个数为0,说明程序头表不存在,也就是说明了可重定位文件是只能用于链接,而不能用于加载的

Start of section headers给出了节头表的起始位置是276字节,位于ELF头0处开始往下数276个字节,节头表项有12个,每个是40个字节(一共有12* 40B)

ELF占52B

最后一行指出第9行是字符串表

现在用另一条命令:readelf -S main.o
得到的结果如图:
在这里插入图片描述
该命令用来读节头表信息

在表的开始前会说明一共有12个节头信息,且节头表的起始位置在 0x114

Addr一栏可以看到地址都是0,因为是可重定位文件,所以不会执行,地址为0

Off是偏移量,即offset。Size指出了该节有多大,接下来指出是否可装入,可执行,对齐方式等等

有四个节将会分配空间,分别为.text可执行,.date和.bss可读可写,.rodata可读,此外其他的节在运行时都不会加载到寄存器中,只作为辅助链

在这里我们可以看到.text起始位置off是34正好呼应了我们上面所讲ELF头占52B=0x34B

在表中可以看到0-11共12个节的情况,第0个节为空,且每一个表象都是64个字节的数据结构。

数据结构:(图片来自mooc袁春风老师的计算机系统基础(一)的课件)
在这里插入图片描述
在这里插入图片描述
接下来用readelf -s main.o得到如下信息:
在这里插入图片描述
从图中可以看出这是符号表的信息

从中间可以看到main函数放在第一节对应.text,array放在第三节的.data中,而sum是一个未定义的符号

到此,大概就知道重定位目标文件是咋解析的了,而重定位其实是相当于给其中的符号赋一个新地址,而原来的地址是0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值