为了账号安全,请及时绑定邮箱和手机立即绑定

什么是C中的目标文件?

什么是C中的目标文件?

C
qq_花开花谢_0 2019-11-22 15:55:10
我正在阅读有关C语言中的库的信息,但尚未找到关于什么是目标文件的解释。其他任何编译文件和目标文件之间的真正区别是什么?如果有人能够用人类语言进行解释,我将感到非常高兴。
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

目标文件是编译阶段的实际输出。它主要是机器代码,但是具有允许链接程序查看其中包含什么符号以及其正常工作所需的符号的信息。(作为参考,“符号”基本上是全局对象,函数等的名称。)

链接器获取所有这些目标文件并将它们组合成一个可执行文件(假设它可以,即:没有任何重复或未定义的符号)。如果您不告诉他们使用命令行选项“仅进行编译”,那么很多编译器都会为您执行此操作(请参阅:它们自己运行链接器)。(-c是常见的“仅编译;不链接”选项。)


查看完整回答
反对 回复 2019-11-22
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

  1. 对象文件是已编译文件本身。两者之间没有区别。

  2. 通过链接目标文件形成可执行文件。

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

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

这是针对高级语言(例如C)的代码的此过程的典型高级流程

->经过预处理器

->提供优化的代码,仍然在C中

->通过编译器

->给出汇编代码

->经过一个汇编程序

->以机器语言给出存储在目标文件中的代码

->通过链接器

->获取可执行文件。

该流程可能会有一些变化,例如,大多数编译器可以直接生成机器语言代码,而无需通过汇编程序。同样,他们可以为您做预处理。尽管如此,分解组成部分以更好地理解还是很不错的。


查看完整回答
反对 回复 2019-11-22
?
holdtom

TA贡献1805条经验 获得超10个赞

有3种目标文件。


可重定位目标文件

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


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


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


共享对象文件

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


可执行目标文件

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


通过多个运行链接器的结果relocatable object files是executable object file。链接器通过将所有相同类型的输入节(例如.data)合并到相同类型的输出节,从左至右合并了命令行中的所有输入目标文件。它使用symbol resolution和relocation。


奖金:

链接时static library,将输入对象中引用的功能复制到最终可执行文件中。随着dynamic libraries创建一个符号表代替,使一个充满活力与图书馆的功能/全局链接。因此,结果是部分可执行的目标文件,因为它取决于库。如果该库不存在,则该文件将不再执行。


链接过程可以如下进行: ld a.o -o myexecutable


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


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


分享编辑


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 699 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信