c语言目标文件作用,关于编译:C语言中的目标文件是什么?

我正在阅读有关C语言中的库的信息,但尚未找到关于什么是目标文件的解释。 其他任何编译文件和目标文件之间的真正区别是什么?

如果有人能够用人类语言进行解释,我将感到非常高兴。

一个更活跃的版本:stackoverflow.com/questions/12122446/

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

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

实际上,对于大多数编译器来说,编译阶段的输出是汇编代码,然后编译器调用汇编器将其转换为目标文件。

@ChrisDodd:较早的编译器经常出现这种情况。如今,除非您要求,否则编译器不会生成汇编代码,并且通常不会在内部使用它。但是无论哪种方式,汇编都是编译阶段的子阶段,因此所有这些都没有意义。

一个目标文件可以执行吗?

@Honey:通常不。即使目标文件是为执行而设计的格式(从根本上来说,它从来都不是),但有关"工作所需的符号"的部分基本上会扼杀交易。甚至您的标准" hello world"都需要链接到C运行时库。

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

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

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

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

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

->经过预处理器

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

->通过编译器

->给出汇编代码

->经过一个汇编程序

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

->通过链接器

->获取可执行文件。

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

优化代码不会在预处理器阶段或紧随其后立即生成。预处理器仅处理自己的语言,仅此而已。优化发生在编译和组装阶段。

是我们编译后得到的目标文件与机器语言中的可执行文件相同吗?我很困惑,因为您说目标文件是在最后一步的第二步创建的,而最后一步是可执行文件。那么,编译后得到的.0文件是可执行文件吗?

单个目标文件也不能执行吗?

有3种目标文件。

可重定位目标文件

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

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

gcc a.c -c

整个过程将是:预处理程序(cpp)将在a.c上运行。它的输出(仍然是源)将输入到编译器(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-> ld1)

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

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

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

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

目标文件是依赖于函数,符号和文本来运行程序的代码。就像旧的电传机一样,需要电传打字才能将信号发送到其他电传机。

与处理器需要运行二进制代码的方式相同,目标文件就像二进制代码,但没有链接。链接会创建其他文件,以便用户不必自己编译C语言。将目标文件与某些编译器(如c语言或vb等)链接后,用户可以直接打开exe文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值