【问题标题】:building binutils before gcc compiler在 gcc 编译器之前构建 binutils
【发布时间】:2013-12-25 13:38:11
【问题描述】:

我正在尝试构建一个 gcc 交叉编译器。我知道在编译交叉编译器之前,我需要已经构建了目标 binutils。为什么编译器的构建需要目标 binutils ?单独的编译器只需要高级代码并将其转换为我在编译器源代码中定义的程序集。那么为什么我需要目标 bintools 来编译交叉编译器呢?它写在我需要在编译交叉编译器之前构建的所有交叉编译器文档中。 (例如http://wiki.osdev.org/Building_GCChttp://www.ifp.illinois.edu/~nakazato/tips/xgcc.html)。

【问题讨论】:

    标签: c gcc binutils


    【解决方案1】:

    GCC 需要一个汇编器将它生成的程序集转换为目标文件(机器代码),以及一个链接器将目标文件链接在一起以生成可执行文件和共享库。它还需要一个归档器来生成静态库/档案。

    这三个通常由binutils 包(以及其他有用的工具)提供:GNU 汇编器as、链接器ldar 归档器。

    【讨论】:

    • 我正在 linux 上编译交叉编译器,它将在 linux 上运行,但会为其他机器(主机!= linux)生成 exe 文件。因此,当我编译交叉编译器时,我需要使用我所在的当前操作系统的 as 和 ld。所以在我的理解中,为了编译交叉编译器,我不需要主机 binutils。每当我想为主机编译源代码时,我只需要主机 bintools,而不是交叉编译器的输出,而必须对主机使用 as 和 ld。所以我的问题是,为什么在编译交叉编译器之前需要它们?
    • 您至少需要汇编器来为目标构建诸如crt*.o 之类的东西,并且可能还需要链接器(尤其是如果您要构建 C++ 标准库)。
    • 好的,我知道在为目标编译源代码时,我需要目标 bintools,但它没有回答为什么我需要它们来构建交叉编译器的问题。我不打算在目标上运行交叉编译器...我在主机上运行它,但获取它生成的 exe 文件并在目标上运行它们....顺便说一句,当我写主机时,我的意思是目标.
    • C 运行时“启动”/拆卸文件crt*.o 在目标机器代码中。它们不在主机上运行,​​它们被链接到目标二进制文件中。而且它们不是每次编译一些代码时都构建的,它们是作为(交叉)编译器的一部分构建的。
    • 所以你说的是我需要目标 bintools 来链接 crt.o 文件。那是在构建交叉编译器时完成的?!顺便说一句,它不能是目标文件,因为这意味着 crt 文件已经编译,但是在没有交叉编译器指定可用指令的情况下它们如何编译?
    【解决方案2】:

    您的关键问题似乎是:

    为什么编译器的构建需要目标binutils?

    Building a cross compiler 中所述,GNU 交叉编译器的构建过程的一部分是使用新编译的交叉编译器为目标构建运行时库。因此,目标的binutils 需要存在才能使该步骤成功。

    可能可以首先构建交叉编译器,使用空文件作为gcc 需要的binutils 组件子集 - 例如asld 和@ 987654327@ 和 ranlib - 然后构建目标 binutils 组件并将其安装到适当的位置,然后构建目标运行时库。

    但是按照以下方式执行操作会更不容易出错(并且文档建议这样做):首先为目标构建 binutils,将指定的可执行文件放在 gcc 的源代码树中,然后构建交叉编译器。

    【讨论】:

      【解决方案3】:

      binutils(二进制实用程序)提供low-level handling of binary files,例如linkingassemblingparsing ELF files。海合会 编译器依赖这些工具来创建executable,因为它生成 binutils 组装成可执行映像的目标文件。

      ELF 是 Linux 用于二进制可执行文件的格式 文件。 GCC 编译器依赖于binutils 来提供大部分platform-specific functionality

      在这里,您正在为其他一些架构进行交叉编译,而不是针对 x86。所以生成的 binutils 是 platform-specific

      配置时必须给出--host!=target。即 --host=i686-pc-linux-gnu 其中 --target=arm-none-linux-gnueabi。 因此生成的可执行文件与已经拥有 binutils 的主机不同。

      加法 基本的东西需要知道。

      build machine,构建工具链的地方。

      host machine,将在其中执行工具链。

      target machine,其中由 工具链被执行。

      因此 binutils 将拥有生成和操作二进制文件的工具 对于给定的 CPU 架构。不适用于一台主机使用

      【讨论】:

      • 我想你误会了 - 为什么我需要目标 bintools 才能编译交叉编译器?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多