目录
一:目标文件分类
目标文件大致可以分为以下3类:
•可重定位目标文件 (.o)
– 其代码和数据可和其他可重定位文件合并为可执行文件
• 每个.o 文件由对应的.c文件生成
• 每个.o文件代码和数据地址都从0开始
• 可执行目标文件 (默认为a.out)
– 包含的代码和数据可以被直接复制到内存并被执行
– 代码和数据地址为虚拟地址空间中的地址
• 共享的目标文件 (.so)
– 特殊的可重定位目标文件,能在装入或运行时被装入到内存并自动被链接,称为共享库文件
– Windows 中称其为 Dynamic Link Libraries (DLLs)
下面我们举个例子来看下可重定位目标文件与可执行目标文件的区别,有如下所示源文件
/* main.c */
int add(int, int);
int main( )
{
return add(20, 13);
}
/* test.c */
int add(int i, int j)
{
int x = i + j;
return x;
}
假如我们生成了可重定位目标文件(test.o)以及可执行目标文件(test)。那么这两个文件中的内容有什么区别,我们通过下面图来分析一下.。
下图中我们可以看出,上面的是可重定位目标文件(test.o),下面的是可执行目标文件(test)。
很明显两者在指令上面并没有什么不同,只是文件的代码和数据的起始地址不一样。
可重定位目标文件(test.o)的地址都是重0开始的,而可执行目标文件(test)却不是的。这是因为test.o文件在经过链接操作之后会将代码和数据映射的虚拟地址空间。
二:目标文件的格式
目标代码(Object Code)指编译器和汇编器处理源代码后所生成的机器语言目标代码
目标文件(Object File)指包含目标代码的文件
最早的目标文件格式是自有格式,非标准的。不同操作系统之后的目标文件格式是不一样的,标准的几种目标文件格式大致可以分为以下几类:
标准的几种目标文件格式
– DOS操作系统(最简单) :COM格式,文件中仅包含代码和数据,且被加载到固定位置
–System V UNIX早期版本:COFF格式,文件中不仅包含代码和数据,还包含重定位信息、
调试信息、符号表等其他信息,由一组严格定义的数据结构序列组成
–Windows:PE格式(COFF的变种),称为可移植可执行(Portable Executable,简称PE)
–Linux等类UNIX:ELF格式(COFF的变种),称为可执行可链接(Executable and Linkable Format,简称ELF)