我正在阅读C中的库,但我还没有找到对象文件的解释。任何其他编译文件和目标文件之间的真正区别是什么? 如果有人能用人类语言解释,我会很高兴。
答案 0 :(得分:123)
目标文件是编译阶段的实际输出。它主要是机器代码,但有一些信息允许链接器查看其中的符号以及工作所需的符号。 (作为参考,“符号”基本上是全局对象,函数等的名称。)
链接器获取所有这些目标文件并将它们组合成一个可执行文件(假设它可以,即:没有任何重复或未定义的符号)。很多编译器会为你做这个(读取:他们自己运行链接器)如果你不告诉他们使用命令行选项“只编译”。 (-c
是一个常见的“只是编译;不要链接”选项。)
答案 1 :(得分:64)
对象文件是编译后的文件本身。两者没有区别。
通过链接目标文件形成可执行文件。
目标文件包含CPU可以理解的低级指令。这就是为什么它也被称为机器代码。
这个低级机器代码是指令的二进制表示,您也可以使用汇编语言直接编写,然后使用汇编语言将汇编语言代码(用英语表示)处理为机器语言(用十六进制表示)
以下是高级语言代码(例如C
)的典型高级流程- >通过预处理器
- >提供优化代码,仍然在C
- >通过编译器
- >给出汇编代码
- >通过汇编程序
- >用机器语言提供存储在OBJECT FILES
中的代码- >通过链接器
- >获取可执行文件。
这个流程可以有一些变化,例如大多数编译器可以直接生成机器语言代码,而无需通过汇编程序。同样,他们可以为您进行预处理。不过,为了更好地理解,拆分成分是很好的。
答案 2 :(得分:24)
有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 - > ld 1 )
1:实际上是collect2,它是ld的包装。
答案 3 :(得分:10)
目标文件就是编译一个(或多个)源文件时获得的文件。
它可以是完全可执行的可执行文件或库,也可以是中间文件。
目标文件通常包含本机代码,链接器信息,调试符号等。
答案 4 :(得分:1)
对象代码是代码,它们依赖于函数,符号,运行机器的文本。就像旧式电传机器一样,需要通过远程传输将信号发送到其他电传机器。 处理器需要二进制代码才能运行机器。对象文件类似于二进制代码,但未链接。链接会创建其他文件,以便用户不必拥有类似c语言的编译器。一旦目标文件与某些编译器(如c语言或vb等)链接,用户就可以直接打开exe文件。