Pit*_*kos 127 c linker compilation object-files
我正在阅读C中的库,但我还没有找到对象文件的解释.任何其他编译文件和目标文件之间的真正区别是什么?
如果有人能用人类语言解释,我会很高兴.
cHa*_*Hao 137
目标文件是编译阶段的实际输出.它主要是机器代码,但有一些信息允许链接器查看其中的符号以及工作所需的符号.(作为参考,"符号"基本上是全局对象,函数等的名称)
链接器获取所有这些目标文件并将它们组合成一个可执行文件(假设它可以,即:没有任何重复或未定义的符号).很多编译器会为你做这个(读取:他们自己运行链接器)如果你不告诉他们使用命令行选项"只编译".(-c是一个常见的"只是编译;不要链接"选项.)
RHT*_*RHT 67
Object文件是编译后的文件本身.这两者没有区别.
通过链接Object文件形成可执行文件.
目标文件包含CPU可以理解的低级指令.这就是为什么它也被称为机器代码.
这个低级机器代码是指令的二进制表示,您也可以使用汇编语言直接编写,然后使用汇编程序将汇编语言代码(用英语表示)处理为机器语言(用十六进制表示).
这是高级语言(如C)中代码的典型高级流程
- >通过预处理器
- >给出优化代码,仍在C语言中
- >通过编译器
- >给出汇编代码
- >通过汇编程序
- >以机器语言提供存储在OBJECT FILES中的代码
- >浏览链接器
- >获取可执行文件.
这个流程可以有一些变化,例如大多数编译器可以直接生成机器语言代码,而无需通过汇编程序.同样,他们可以为您进行预处理.尽管如此,为了更好地理解,拆分成分仍然是件好事.
Pas*_*lis 26
有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.
链接到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的包装器.