C中的目标文件是什么?
我正在阅读关于C语言的库,但是我还没有find关于目标文件的解释。 其他编译文件和目标文件之间的真正区别是什么?
如果有人能用人类的语言来解释我会很高兴。
目标文件是编译阶段的实际输出。 它主要是机器代码,但是有一些信息可以让链接器查看其中的符号以及工作所需的符号。 (作为参考,“符号”基本上是全局对象,函数等的名称)
链接器将所有这些目标文件合并为一个可执行文件(假定它可以,即:没有任何重复或未定义的符号)。 如果你不告诉他们使用命令行选项进行“编译”,许多编译器会为你做这些事情(阅读:他们自己运行链接器)。 ( -c
是一个普通的“只编译;不链接”选项。)
-
一个对象文件是编译的文件本身。 两者没有区别。
-
可执行文件是通过链接对象文件形成的。
-
目标文件包含CPU可以理解的低级指令。 这就是为什么它也被称为机器码。
-
这个低级别的机器码是指令的二进制表示,您也可以使用汇编语言直接编写指令,然后使用汇编程序将汇编语言代码(以英文表示)转换为机器语言(用hex表示)。
以下是高级语言(如C语言)代码的典型高级stream程
– >通过预处理器
– >给优化的代码,仍在C中
– >通过编译器
– >给汇编代码
– >通过汇编程序
– >以机器语言提供存储在OBJECT FILES中的代码
– >通过链接器
– >获得一个可执行文件。
这个stream程可以有一些变化,例如大多数编译器可以直接生成机器语言代码,而不需要经过汇编程序。 同样,他们可以为你做预处理。 不过,为了更好的理解,分散成员是很好的。
有3种目标文件。
可重定位的对象文件
包含机器代码的forms,可以在链接时与其他可重定位的目标文件相结合,以形成一个可执行的目标文件。
如果你有一个ac
源文件,用GCC创build它的目标文件,你应该运行: gcc ac -c
完整的过程将是:预处理器(CPP)将运行交stream其输出(仍然源)将被馈送到编译器(cc1)。 它的输出(汇编)将被送入汇编器(as),这将产生relocatable object file
。 该文件包含目标代码和链接(如果使用-g
则可能会debugging)元数据,并且不能直接执行。
共享对象文件
特殊types的可重定位目标文件,可以在加载时或运行时dynamic加载。 共享库就是这种对象。
可执行的对象文件
它们包含可以直接加载到内存中的机器代码(通过加载器,例如execve),然后执行。
在多个relocatable object files
上运行链接程序的结果是一个executable object file
。 链接器通过将所有相同types的input段(例如.data
)合并到同一types的输出段,从而从命令行合并所有input对象文件,从左到右。 它使用symbol resolution
和relocation
。
奖金:
链接到static library
,input对象中引用的函数被复制到最终的可执行文件。 使用dynamic libraries
,会创build一个符号表,以便与库的函数/全局variables进行dynamic链接。 因此,结果是部分可执行的目标文件,因为它依赖于库。 (简而言之,如果库消失,文件将不能再执行)。
链接过程可以如下完成: ld ao -o myexecutable
命令: gcc ac -o myexecutable
将调用所有在第1点和第3点提到的命令(cpp – > cc1 – > as – > ld 1 )
1:实际上是collect2,它是ld上的包装。
目标文件就是你编译一个(或几个)源文件时得到的。
它可以是完整的可执行文件或库,也可以是中间文件。
目标文件通常包含本地代码,链接器信息,debugging符号等等。
对象代码是依赖于函数,符号,运行机器的文本的代码。 就像老式电传机一样,它需要通过电传打字将信号发送给其他电报机。 以同样的方式处理器需要二进制代码来运行机器。 目标文件就像二进制代码,但没有链接。 链接创build额外的文件,以便用户不必像c语言一样编译器。 用户可以直接打开的exe文件一旦目标文件链接到一些编译器如c语言,或vb等