一、目标文件
我们知道,程序在经过预编译、编译以及汇编之后就得到了目标文件。而在window中,可执行程序的格式是PE,在Linux中是ELF。其实目标文件和可执行文件的格式几乎是一样的,广义上将两者都看作是ELF文件。在这里,我们主要讨论Linux下ELF格式的目标文件。实际上,在Linux中,不光目标文件和可执行文件是按照ELF文件格式存储的,还有动态链接库和静态链接库中的文件都是以ELF文件格式存储的,他们统称为ELF文件。
二、目标文件的结构
目标文件中除去机器指令代码和数据,还有链接时需要的符号表、调试信息等等。在目标文件中,这些信息都是以“段”的形式存储的(得益于COFF中关于“段”的机制,而ELF就是由COFF发展而来的文件格式)。
下图是目标文件中的结构:
(1)
首先将以下程序进行编译,得到main.o目标文件,我们随后对它进行分析。
#include <stdio.h>
#include <stdlib.h>
int gdata1 = 10;
int gdata2 = 0;
int gdata3;
static int gdata4 = 20;
static int gdata5 = 0;
static int gdata6;
int main()
{
int ldata1 = 30;
int ldata2 = 0;
int ldata3;
static int ldata4 = 40;
static int ldata5 = 0;
static int ldata6;
exit(0);
}
我们先利用“objdump”来查看目标文件中的结构。
$ objdump -h main.o ——> 查看该ELF文件中的关键段的基本信息
(2)
在上图中,我们看到了5个段的信息,主要的几个段就是.text、.data、.bss、.comment。其中,.text和.data都有“CONTENTS”标志,而.bss却没有,这表明