可重定位目标文件经由源程序预处理,编译,汇编之后得到的文件。其中包括不可读的二进制代码,文件扩展名为.o。 现有两个模块的代码
main.c int sum(int *a,int n); int array[2]={1,2}; int main() { int val=sum(array,2); retuan val; } sum.c int sum(int *a,int n) { int i,s=0; for(i=0;i<=n;i++){ s+=a[i]; } return s; } 一.在Linux的终端中,使用gcc -c main.c sun.c命令可得到一个可重定位目标文件: 下图是一个典型的ELF可重定位目标文件的格式 该可重定位目标文件主要是由若干节构成的,除了这些节还有两个重要的部分,一个是ELF头,另一个是节头表。 二. ELF头包含了文件结构说明信息。在Linux的终端中,使用gcc readelf -h main.o命令就可以看到main.o的ELF头。 ELF头以一个16个字节的序列开始,图中前4个字节 7f 45 4c 46 通常用来确定文件的类型或格式,我们称之为魔数。加载或读取文件时,可用魔数确定文件类型是否正确。 入口点地址是0,因为这是可重定位目标文件,还没有链接成可执行目标文件,就还不会进行加载执行。 程序头偏移量大小为0是因为可重定位目标文件没有程序头表。 三.接着使用gcc readelf -S main.o命令就可以看到main.o的节头表。 节头表通常会描述每个节的节名,在文件中的偏移,大小,访问属性,对其方式等。该节头表中描述了从0到11这12个节的信息,起始地址为0x224。 其中Addr虚拟地址这一字段每一节都是0,因为这不是可执行文件,不会加载执行,在可重定位目标文件中,每个可装入节的起始地址总是0。 offset表示起始地址,Size表示节的大小,Flg表示可执行方式,AL表示对齐方式。 如 .text节是从0x34的地址开始的,size是16进制的31,可装入内存执行,而且是只可执行,对齐方式按1字节对齐。