1. 目标文件
1.1 目标文件种类
有三种:
· 可重定位目标文件
· 可执行目标文件
· 共享目标文件
1.1.1 可重定位目标文件
被用于静态链接的文件,都是可重定位目标文件。
根据这个概念,静态库文件(.a/.lib)和.o文件都是“可重定位目标文件”,因为它们都是静态链接的。
疑问:为什么称为“可重定位”?
因为静态连接时,逻辑地址需要被重定位为运行地址,所以就被称为可重定位目标文件。
1.1.2 可执行目标文件
可以被执行的文件就是“可执行目标文件”,其实就是我们常说的“可执行文件/可执行程序”。
1.1.3 共享目标文件
被动态链接的文件其实就是共享目标文件,其实就是动态库,因为动态库是动态链接的。
因为动态库被共享使用的特性,因此也被称为共享库,所以动态库文件也被称为了共享目标文件。
1.2 目标文件格式
各不同运行环境之间(OS),目标文件的格式是不同的,所以针对不同环境的目标文件,格式是不一样的。
这就好比不同公司的规章制度肯定有区别。
疑问:目标文件格式有什么用?
格式规定了目标文件中指令和数据的组成结构,每个环境(OS)只认自己的格式。
虽然不同的格式之间有区别,但是大体上都是类似的。
1.2.1 裸机目标文件
如果你的程序最终是运行在裸机上的话,裸机目标文件的格式为.bin格式。
我们学习后面的arm裸机时,程序就是裸机运行的,所以那时编译出的目标文件都是.bin格式的。
1.2.2 unix系统的目标文件格式
(1)早期unix
使用的a.out格式,因为这个历史遗留,现在再unix下编译时,如果不指定可执行文件的名字的话,
默认起名为a.out,这个名字就来自于a.out这个格式名。
Linux的父亲是Unix,因此对于Linux来说,编译时如果不指定可执行文件名的话,默认也起名为a.out,
要注意,尽管起名为a.out,但是Linux系统目标文件的格式并不是a.out格式,仅仅只是沿用了a.out这个名字而已。
(2)system V unix
unix升级到第5版本时,a.out格式变为了COFF格式(Common Object File Format:一般目标文件格式)。
(3)现代Unix
已经改用ELF格式(Excutable and Linkable Format:可执行可链接格式)。
1.2.3 windows
windows是PE格式(Portable Excutable:可移植、可执行格式),由Unix COFF格式格式演变而来。
1.2.4 Linux
与现代的Unix一样的,使用的也是ELF格式,虽然在Linux下,编译时默认的可执行文件的名字是a.out,
但是其实目标文件的格式是ELF(可执行可链接格式)。
如何理解ELF(可执行可链接格式)的含义?
(1)可重定位目标文件、共享目标文件:可以被链接
(2)可执行目标文件:可以被执行
我们这边的程序是运行在Linux系统上的,因此我们要接触的是Linux的ELF格式。