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