ELF可重定位目标文件格式
现在我们用一个简单的C语言程序addvec.c做示范,代码如下:
int addvec=0p;
void addvec(int *x,int *y,int *z,int z){
int i;
addvec++;
for(i=0;i<n;i++)
z[i]=x[i]+y[i];
}
打开终端,输入指令
即可得到相对应的ELF可重定位目标文件addvec.o
输入如下指令,即可得到读取目标文件的相关内容
具体内容如下:
这个序列描述了生成该文件的系统的字的大小和字节顺序,包括ELF头的大小、目标文件的类型、机器类型、节头部表的文件偏移,以及节头部表中的大小和数量。
不同节的位置和大小是由节头部表的描述的,其中目标文件中每个节都有一个固定大小的条目。
输入如下指令即可看到该目标文件的节头表格式
具体内容如下:
从截图可看出,该目标文件节头表有十个节,节的大小、数量会有些许差异,不同的节存放着不同的节点信息,一个典型的ELF可重定位目标文件就包括了以上十个节。
.text: 已编译程序的机器代码。
.rodata: 只读数据,比如printf语句中的格式串和开关语句中跳转表。
.data: 已初始化的全局和静态C变量。局部C变量在运行时被保存在栈里面,既不出现在.data节中,也不出现在.bss中。
.bss: 未初始化的全局和静态C变量,以及所有被初始化为0的全局或静态变量。
…等。