【问题标题】:Object code, linking time in C language目标代码,C语言中的链接时间
【发布时间】:2010-12-06 13:37:19
【问题描述】:

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

【问题讨论】:

    标签: c linker compilation


    【解决方案1】:

    Wikipedia 说,

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

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

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

    另一个很棒的网站有更详细的信息和有用的图表,here

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        您可以了解链接器的作用herehere

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-18
          • 2012-01-31
          • 1970-01-01
          • 1970-01-01
          • 2018-06-11
          • 2023-01-10
          • 1970-01-01
          相关资源
          最近更新 更多