目标代码
目标代码(英語:)指计算机科学中编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。[1]目标文件(英語:)即存放目标代码的计算机文件,它常被称作二进制文件()。
程序执行 |
---|
基础概念 |
代码类型 |
编译策略 |
|
知名运行环境 |
著名编译器及工具链 |
目标文件包含着机器代码(可直接被计算机中央处理器执行)以及代码在运行时使用的数据,如重定位信息,如用于链接或调试的程序符号(变量和函数的名字),此外还包括其他调试信息。[2]目标文件是从源代码文件产生程序文件这一过程的中间产物,链接器正是通过把目标文件链接在一起来生成可执行文件或库文件。目标文件中唯一的要素是机器代码,例如,用于嵌入式系统的目标文件可能仅仅含有机器代码。
目标文件格式
目标文件用以存放目标代码和由编译器或汇编器生成的相关数据的计算机文件格式称为目标文件格式。
目标文件格式有许多不同的种类。最初每种类型计算机都拥有自身独特的格式,但随着Unix和其他可移植操作系统的问世,人们定义了例如COFF和ELF这些格式,并在不同的系统上使用它们。通常,链接器的输入和输出使用相同的文件格式,库文件和可执行文件格式也是一样使用相同的格式。
设计或选择一种目标文件格式是计算系统整体设计的关键部分。它影响着链接器的性能并因此影响着程序员在开发时的总耗时;如果格式是用于可执行文件,那么格式的设计还会影响程序的开始运行花费的时间,以及影响到系统对用户请求的反应速度。大部分目标文件格式以区块的方式来组织,每一区块中都装载着同种数据。在虚拟内存系统需要这些块的时候,它可以通过将这些块分页后调入,无需进一步地处理就可使用。
最简单的目标文件格式是DOS的COM文件格式(OBJ文件格式),它是一种仅仅由原始数据组成的文件。COM格式的文件始终被加载到某固定位置。其他的格式都由一组复杂精密的数据结构序列组成,这些格式的规范说明书一般会有许多页。
调试信息可以是目标文件格式中的一个组成部分,就像COFF中的那样,或是一种可能被数个目标格式使用的半独立格式,如stabs或DWARF。
GNU计划的BFD库提供了一套通用的应用程序编程接口用来操纵各式各样的目标文件格式。
典型的目标文件格式所支持的数据类型有:
- 符号起始区块(BSS Block Started by Symbol的缩写)
- 正文段(text segment 或译作代码段)
- 数据段(data segment)
主要格式
- DOS
- COM
- EXE(MZ)
- 可重定位目标模块格式(Relocatable Object Module Format 一般称作“OBJ文件”或“OMF”,也在微软视窗操作系统中被一些开发工具厂商所使用)
- 嵌入式系统
- IEEE-695
- S-records
- Macintosh
- PEF/CFM
- Unix
- 视窗(Windows)
- 16位的New Executable
- Portable Executable
- 其他
- IBM 360目标格式
- NetWare可加载模块(NetWare Loadable Module 缩写为NLM)
- OMF(VME)
- SOM(HP)
- XBE(Xbox的可执行文件格式)
- APP(Symbian OS的可执行文件格式)
- 可重定位动态目标文件格式(Relocatable Dynamic Object File Format 缩写为RDOFF)
- Hunk(AmigaOS)
另见
参考文献
- 《什么是目标代码?》(正文第二节) (页面存档备份,存于)(英文)
- BFD Internals(第八章object file的解释) 的存檔,存档日期2007-06-27.(英文)
外部链接
- 《》(Linkers and Loaders) (页面存档备份,存于) John R. Levine著 (Morgan Kaufmann出版社,2000年)