编译时,C在链接时间之前生成对象代码。 我想知道目标代码是否是二进制的形式呢? 如果是这样,链接时间接下来会发生什么?
答案 0 :(得分:6)
在计算机科学中,目标文件是 一个有组织的命名集合 对象,通常是这些对象 是计算机指令的序列 以机器代码格式,可能是 由计算机的CPU直接执行。
目标文件通常由 作为处理结果的编译器 源代码文件。对象文件包含 紧凑的代码,通常被称为 “二进制”。
通常使用linker 生成可执行文件或库 通过合并部分目标文件 一起。嵌入的对象文件 系统通常只包含 机器码但一般来说,对象 文件还包含供...使用的数据 运行时的代码:重定位 信息,堆栈展开 信息,评论,程序符号 (变量和函数的名称) 链接和/或调试目的,和 其他调试信息。
另一个很棒的网站有更详细的信息和有用的图表here:
答案 1 :(得分:1)
由C编译器生成的目标文件本质上包含二进制代码,每个地方都有一个空洞,其中一个地址应该是未知的(来自其他文件的函数地址 - 包括库 - 被调用,来自其他文件的变量地址)在这一个中访问,...)。
它还包含一个由符号名称索引的表(“x”或“_x”表示变量x
,“f”或“_f”表示函数f
)。对于每个这样的符号,有一个状态代码(“在此定义”,“此处未定义但使用”,......)以及二进制代码中的空洞地址,当它们变为已知时需要与每个地址一起存档。
如果您使用的是Unix(或Windows上的gcc),则可以使用命令“nm file.o”打印后面的表。
答案 2 :(得分:0)