对象代码,用C语言链接时间

问题描述 投票:0回答:3

编译时,C在链接时间之前生成目标代码。我想知道目标代码是否是二进制的形式呢?如果是这样,链接时间接下来会发生什么?

c linker compilation
3个回答
6
投票

Wikipedia说,

在计算机科学中,目标文件是命名对象的有组织的集合,并且通常这些对象是机器代码格式的计算机指令序列,其可以由计算机的CPU直接执行。

作为处理源代码文件的结果,目标文件通常由编译器生成。对象文件包含紧凑代码,通常称为“二进制文件”。

linker通常用于通过将部分目标文件合并在一起来生成可执行文件或库。嵌入式系统的目标文件通常只包含机器代码,但通常,目标文件还包含代码在运行时使用的数据:重定位信息,堆栈展开信息,注释,程序符号(变量和函数的名称),用于链接和/或调试目的,以及其他调试信息。

另一个伟大的网站有更详细的信息和有用的图表,hereDiagram


1
投票

由C编译器生成的目标文件实质上包含二进制代码,每个地方都有一个空洞,其中地址应该是未知的(来自其他文件的函数地址 - 包括库 - 调用,来自其他文件的变量地址)在这一个,...)。

它还包含一个由符号名称索引的表(变量x为“x”或“_x”,函数f为“f”或“_f”)。对于每个这样的符号,有一个状态代码(“在此定义”,“此处未定义但使用”,......)以及二进制代码中的空洞地址,当它们变为已知时需要与每个地址一起存档。

如果您使用的是Unix(或Windows上的gcc),则可以使用命令“nm file.o”打印后面的表。


0
投票

是的,目标代码通常是二进制形式。只需尝试在您喜欢的文本编辑器中打开它。

你可以了解连接器做herehere

© www.soinside.com 2019 - 2024. All rights reserved.