什么是C中的目标文件?

Pit*_*kos 127 c linker compilation object-files

我正在阅读C中的库,但我还没有找到对象文件的解释.任何其他编译文件和目标文件之间的真正区别是什么?
如果有人能用人类语言解释,我会很高兴.

cHa*_*Hao 137

目标文件是编译阶段的实际输出.它主要是机器代码,但有一些信息允许链接器查看其中的符号以及工作所需的符号.(作为参考,"符号"基本上是全局对象,函数等的名称)

链接器获取所有这些目标文件并将它们组合成一个可执行文件(假设它可以,即:没有任何重复或未定义的符号).很多编译器会为你做这个(读取:他们自己运行链接器)如果你不告诉他们使用命令行选项"只编译".(-c是一个常见的"只是编译;不要链接"选项.)

  • @ChrisDodd:旧编译器经常出现这种情况.目前,编译器不会生成汇编代码,除非您要求它,并且通常不会在内部使用它.但无论哪种方式,汇编都将是编译阶段的一个子阶段,所以这一切都没有实际意义. (12认同)
  • 单个目标文件可以执行吗? (2认同)
  • @Honey:一般来说,没有。即使目标文件是为执行而设计的格式(它基本上从来没有),关于“它需要的符号才能工作”的部分基本上会扼杀交易。甚至您的标准“hello world”也需要链接到 C 运行时库。 (2认同)

RHT*_*RHT 67

  1. Object文件是编译后的文件本身.这两者没有区别.

  2. 通过链接Object文件形成可执行文件.

  3. 目标文件包含CPU可以理解的低级指令.这就是为什么它也被称为机器代码.

  4. 这个低级机器代码是指令的二进制表示,您也可以使用汇编语言直接编写,然后使用汇编程序将汇编语言代码(用英语表示)处理为机器语言(用十六进制表示).

这是高级语言(如C)中代码的典型高级流程

- >通过预处理器

- >给出优化代码,仍在C语言中

- >通过编译器

- >给出汇编代码

- >通过汇编程序

- >以机器语言提供存储在OBJECT FILES中的代码

- >浏览链接器

- >获取可执行文件.

这个流程可以有一些变化,例如大多数编译器可以直接生成机器语言代码,而无需通过汇编程序.同样,他们可以为您进行预处理.尽管如此,为了更好地理解,拆分成分仍然是件好事.

  • 优化的代码不是在预处理器阶段生成的,也不是在预处理器阶段之后生成的.预处理器只处理自己的语言,就是这样.优化发生在编译和汇编阶段. (4认同)

Pas*_*lis 26

有3种目标文件.

可重定位的目标文件

包含可在链接时与其他可重定位目标文件组合的形式的机器代码,以形成可执行目标文件.

如果您a.c有源文件,要使用GCC创建其目标文件,您应该运行: gcc a.c -c

完整的过程将是:预处理器(cpp)将在ac上运行其输出(仍然是源)将被送入编译器(cc1).它的输出(汇编)将被送入汇编程序(as),这将产生relocatable object file.该文件包含目标代码和链接(并且可能调试,如果-g使用的话)元数据,并且不能直接执行.

共享对象文件

特殊类型的可重定位目标文件,可以在加载时或运行时动态加载.共享库就是这种对象.

可执行对象文件

它们包含可以直接加载到内存中的机器代码(通过加载程序,例如execve)并随后执行.

在多个上运行链接器的结果relocatable object filesexecutable object file.链接器通过将所有相同类型的输入节(例如.data)合并到相同类型的输出节来从左到右合并来自命令行的所有输入对象文件.它使用symbol resolutionrelocation.

奖金:

链接到a时static library,输入对象中引用的函数将复制到最终的可执行文件中.使用dynamic libraries,创建一个符号表,它将启用与库的函数/全局变量的动态链接.因此,结果是部分可执行的目标文件,因为它取决于库.(简单来说,如果库已经消失,则文件将无法再执行).

链接过程可以按如下方式完成: ld a.o -o myexecutable

命令:gcc a.c -o myexecutable将调用第1点和第3点提到的所有命令(cpp - > cc1 - > as - > ld 1)

1:实际上是collect2,它是ld的包装器.


Mat*_*Mat 11

目标文件就是编译一个(或多个)源文件时获得的文件.

它可以是完全可执行的可执行文件或库,也可以是中间文件.

目标文件通常包含本机代码,链接器信息,调试符号等.