我正在阅读C语言中的库,但是我还没有找到关于什么是目标文件的解释。任何其他编译文件和目标文件之间的真实的区别是什么?如果有人能用人类语言解释我会很高兴。
oymdgrw71#
目标文件是编译阶段的真实的输出。它主要是机器码,但有一些信息允许链接器查看其中有什么符号以及它工作所需的符号。(作为参考,“符号”基本上是全局对象、函数等的名称。)链接器获取所有这些目标文件,并将它们组合成一个可执行文件(假设它可以,即:不存在任何重复或未定义的符号)。许多编译器会为您执行此操作(请阅读:他们自己运行链接器),如果你不告诉他们使用命令行选项“只编译”(-c是一个常见的“只编译;不链接”选项。)
-c
6g8kf2rb2#
1.对象文件就是编译后的文件本身,两者没有区别。1.可执行文件是通过链接目标文件而形成的。1.目标文件包含能被CPU理解的低级指令。这就是为什么它也被称为机器码。1.这种低级机器代码是指令的二进制表示,您也可以直接使用汇编语言编写指令,然后使用汇编程序将汇编语言代码(以英语表示)处理为机器语言(以十六进制表示)。下面是此过程的典型高级流程,用于高级语言(如C)中的代码--〉通过预处理器--〉给予优化的代码,仍然是C语言--〉通过编译器--〉给予汇编代码--〉通过汇编程序--〉以机器语言给予存储在对象文件中的代码--〉通过链接器--〉以获取可执行文件。这个流程可以有一些变化,例如大多数编译器可以直接生成机器语言代码,而不需要经过汇编器。同样,他们可以为你做预处理。不过,为了更好地理解,最好把这些组成部分分开。
s8vozzvw3#
有3种目标文件。
包含机器代码,其形式可以在链接时与其他可重定位目标文件组合,以形成可执行目标文件。如果你有一个a.c源文件,要用GCC创建它的目标文件,你应该运行:gcc a.c -c整个过程将是:
a.c
gcc a.c -c
cc1
as
该可重定位目标文件包含:
-g
一种特殊类型的可重定位目标文件,可以在加载时或运行时动态加载。
包含可直接加载到内存(通过加载程序,例如execve)并随后执行的机器代码。在多个可重定位对象文件上运行链接器的结果是可执行对象文件。链接器通过将所有相同类型的输入节(例如.data)合并到相同类型的输出节,从左到右合并命令行中的所有输入对象文件。它使用符号解析和重定位。
.data
当链接静态库时,输入对象中引用的函数被复制到最终的可执行文件中。使用动态库时,会创建一个符号表,它将启用与库的函数/全局函数的动态链接。因此,结果是一个部分可执行的目标文件,因为它依赖于库。如果库不存在,文件将不再执行。链接过程可按如下方式完成:
ld a.o -o myexecutable
命令:gcc a.c -o myexecutable将调用第1点和第3点提到的所有命令(cpp-〉cc1-〉as-〉ld 1)1:实际上是collect2,它是ld上的 Package 器。
gcc a.c -o myexecutable
cpp
ld
collect2
8wtpewkr4#
目标文件就是编译一个(或多个)源文件时得到的文件。它可以是完全完成的可执行文件或库,也可以是中间文件。目标文件通常包含本机代码、链接器信息、调试符号等。
z4iuyo4d5#
目标文件是依赖于函数、符号和文本来运行程序的代码。就像老式的电传机一样,需要电传打字才能把信号发送到其他电传机。处理器需要二进制代码才能运行,目标文件类似于二进制代码,但没有链接。链接创建了额外的文件,这样用户就不必自己编译C语言。一旦目标文件与一些编译器(如C语言或vb等)链接,用户就可以直接打开exe文件。
5条答案
按热度按时间oymdgrw71#
目标文件是编译阶段的真实的输出。它主要是机器码,但有一些信息允许链接器查看其中有什么符号以及它工作所需的符号。(作为参考,“符号”基本上是全局对象、函数等的名称。)
链接器获取所有这些目标文件,并将它们组合成一个可执行文件(假设它可以,即:不存在任何重复或未定义的符号)。许多编译器会为您执行此操作(请阅读:他们自己运行链接器),如果你不告诉他们使用命令行选项“只编译”(
-c
是一个常见的“只编译;不链接”选项。)6g8kf2rb2#
1.对象文件就是编译后的文件本身,两者没有区别。
1.可执行文件是通过链接目标文件而形成的。
1.目标文件包含能被CPU理解的低级指令。这就是为什么它也被称为机器码。
1.这种低级机器代码是指令的二进制表示,您也可以直接使用汇编语言编写指令,然后使用汇编程序将汇编语言代码(以英语表示)处理为机器语言(以十六进制表示)。
下面是此过程的典型高级流程,用于高级语言(如C)中的代码
--〉通过预处理器
--〉给予优化的代码,仍然是C语言
--〉通过编译器
--〉给予汇编代码
--〉通过汇编程序
--〉以机器语言给予存储在对象文件中的代码
--〉通过链接器
--〉以获取可执行文件。
这个流程可以有一些变化,例如大多数编译器可以直接生成机器语言代码,而不需要经过汇编器。同样,他们可以为你做预处理。不过,为了更好地理解,最好把这些组成部分分开。
s8vozzvw3#
有3种目标文件。
1.可重定位目标文件:
包含机器代码,其形式可以在链接时与其他可重定位目标文件组合,以形成可执行目标文件。
如果你有一个
a.c
源文件,要用GCC创建它的目标文件,你应该运行:gcc a.c -c
整个过程将是:
a.c
上运行cc1
)。as
)as
)将生成可重定位目标文件。该可重定位目标文件包含:
-g
)2.共享目标文件:
一种特殊类型的可重定位目标文件,可以在加载时或运行时动态加载。
3.可执行目标文件:
包含可直接加载到内存(通过加载程序,例如execve)并随后执行的机器代码。
在多个可重定位对象文件上运行链接器的结果是可执行对象文件。链接器通过将所有相同类型的输入节(例如
.data
)合并到相同类型的输出节,从左到右合并命令行中的所有输入对象文件。它使用符号解析和重定位。附加:静态库与动态库
当链接静态库时,输入对象中引用的函数被复制到最终的可执行文件中。使用动态库时,会创建一个符号表,它将启用与库的函数/全局函数的动态链接。因此,结果是一个部分可执行的目标文件,因为它依赖于库。如果库不存在,文件将不再执行。
链接过程可按如下方式完成:
命令:
gcc a.c -o myexecutable
将调用第1点和第3点提到的所有命令(cpp
-〉cc1
-〉as
-〉ld
1)1:实际上是
collect2
,它是ld
上的 Package 器。8wtpewkr4#
目标文件就是编译一个(或多个)源文件时得到的文件。
它可以是完全完成的可执行文件或库,也可以是中间文件。
目标文件通常包含本机代码、链接器信息、调试符号等。
z4iuyo4d5#
目标文件是依赖于函数、符号和文本来运行程序的代码。就像老式的电传机一样,需要电传打字才能把信号发送到其他电传机。
处理器需要二进制代码才能运行,目标文件类似于二进制代码,但没有链接。链接创建了额外的文件,这样用户就不必自己编译C语言。一旦目标文件与一些编译器(如C语言或vb等)链接,用户就可以直接打开exe文件。