【问题标题】:Recipe for compiling binutils & gcc together?一起编译 binutils 和 gcc 的配方?
【发布时间】:2010-12-16 02:40:22
【问题描述】:

根据gcc build instructions,您可以在构建 gcc(以及 gmp、mpc 等)的同时构建 binutils。

这是该页面的内容:

如果您还打算构建 binutils (要么升级现有的 安装或代替使用 您的操作系统的相应工具), 解压 binutils 发行版 在同一目录中或 分开一个。在后一种情况下,添加 任何组件的符号链接 您打算构建的 binutils 与编译器(bfd、binutils、 气体,gprof,ld,操作码,...)到 包含 GCC 源代码的目录。

GMP、MPFR 和 MPC 也是如此 库可以自动构建 与海湾合作委员会一起。打开 GMP 包装, MPFR 和/或 MPC 源分布 在包含 GCC 的目录中 来源并重命名其目录 分别为 gmp、mpfr 和 mpc(或 使用相同的符号链接 名称)。

这适用于 gmp、mpc、mpfr,但我似乎无法让它构建所有 binutils。 我也不知道如何让它从 binutils 构建新的黄金链接器。 有问题的版本是 gcc-4.4.2 和 binutils-2.20。

一步一步的指导会很棒(对我和其他遇到这个问题的人来说)。

【问题讨论】:

  • 您可能也有兴趣了解Linux From Scratch 是如何做到的。它对 binutils、GCC 和 glibc(另一个主要的 GCC 依赖项)使用 2 步引导程序。

标签: gcc bootstrapping binutils


【解决方案1】:

这应该还是可以支持的,因为它通常用于构建交叉编译器。

事实上,我刚刚使用 gcc 4.6.0 和 binutils 2.21(在适当的版本中使用 gmp、mpc 和 mpfr)完成了这项工作,以下似乎工作正常:

  • 将您要构建的文件(gcc-4.6.0.tar.bz2、binutils-2.21.tar.bz2 等)的所有存档放入一个新目录,例如src
  • 将它们全部解压到这个目录中,这样你最终会得到gcc-4.6.0/ binutils-2.21/ gmp-5.0.2/ 和更多的并排放置

    tar jxvf gcc-4.6.0.tar.bz2
    ... (unpack others here, watch file lists scroll past)
    
  • cd gcc-4.6.0 并符号链接 gmp、mpc 和 mpfr 目录,但链接中没有它们的版本号,例如:

    ln -s ../gmp-5.0.2 gmp
    
  • 现在对 gcc 目录中不存在的 binutils 目录中的所有内容进行符号链接,因此任何已经存在的内容都将优先考虑,但 binutils 工具看起来对构建可见:

    for file in ../binutils-2.21/* ; do ln -s "${file}" ; done
    
  • 更改一个目录并创建一个构建目录以将所有这些单独构建到源中(这一直是推荐的方法,而且它往往仍然比在源目录中构建更可靠):

    cd .. ; mkdir build
    
  • 此时您应该有一组目录和链接,如下所示:

    binutils-2.21/
    build/
    gcc-4.6.0/
       gmp -> ../gmp-5.0.2
       mpc -> ../mpc-0.9
       mpfr -> ../mpfr-3.0.1
       bfd -> ../binutils-2.21/bfd
       binutils -> ../binutils-2.21/binutils
       gas -> ../binutils-2.21/gas
       ... (lots more symlinks for binutils here, plus existing gcc stuff)
    gmp-5.0.2/
    mpc-0.9/
    mpfr-3.0.1/
    
  • 从此目录配置全部内容,使用您需要传递给配置的任何选项:

    ../gcc-4.6.0/configure --prefix=/foo/bar --enable-languages=c,c++,ada
    
  • 构建、等待、安装(您可能希望在此处使用 make -j4 左右来并行构建一些构建,因为这需要一段时间):

    make -j4 ; make install
    

如果还没有目标,则将目标添加到您的路径中(如果这超出了/etc/ld.so.conf 中指定的路径,则可能将 lib 目录添加到 LD_LIBRARY_PATH,如有关在make install 步骤中安装库的消息中所述),并且一切都应该在这个新版本中运行起来。

一旦你打开了一个新的 shell,可能值得检查一下你正在使用这个已安装的版本,其中:

    `which gcc`

    `which as`

..以及版本与您期望的一样:

    `gcc --version`

    `as --version`

..以及(当然)测试已安装的版本是否可以通过一些简单的示例很好地构建可执行文件,然后再将其释放到您的代码库中:)

编辑:下面的 cmets 包含一些已知可以协同工作的版本集。并非所有组合都有效,因此您可能需要针对上述组合的不同组合进行反复试验!

稍后编辑:gdb 也可以包含在此构建中(再次需要兼容的组件版本 - 请参阅 cmets)。 以类似的方式将其添加为 binutils 之后的最后一件事,使用 for f in ../gdb-8.1.1/* ; do ln -s "${f}" ; done,构建将自动拾取它。

【讨论】:

  • 给我自己和其他人的说明:使用 gcc 4.7.1 执行此操作需要比当前最新版本更旧的 mpfr 版本。我已经成功使用了 mpfr-2.4.2,但是任何大于 3.0 的东西都对我不起作用。 (所有组件列表:binutils-2.22、gcc-4.7.1、gmp-5.0.5、mpc-1.0、mpfr-2.4.2)
  • 另一个注意事项:使用 gcc 4.7.2 执行此操作,使用 binutils-2.22 和 gmp、mpc、mpfr 的 contrib/download_prerequisites;配方有效,但 gcc 无法使用 -flto 构建,导致:collect2:致命错误:找不到“ld”。为了解决这个问题,在你的 ...prefix/bin 目录中创建一个符号链接 ld -> ld-new。
  • 如果您想启用“石墨”优化(请参阅gcc.gnu.org/wiki/Graphite),那么您还需要 ISL 和 ClooG 库,并以与其他库相同的方式对它们进行符号链接( mpfr、mpc 等)。我会尽快更新说明以包含此内容。
  • gcc 4.9 build 适用于:binutils 2.24、cloog 0.18.1、gmp 5.1.3 isl 0.12.2 mpc 1.0.2 mpfr 3.1.2。使用“--disable-werror”选项来避免在从 binutils 构建 bfd 版本时由于宏警告而出现的警告。 (这些警告在他们的 git repo 的当前开发版本中已修复)
  • 我从已编辑的答案中删除了指向 osdev 站点矩阵的链接以获取交叉编译器 gcc/binutils 版本兼容性(osdev.org 有 a large binutils / GCC compatibility matrix),因为这在 a两种方法:(1)构建一个交叉编译器gcc,它对版本有不同的限制,以及(2)binutils构建不是在树中与gcc构建结合,而是预先单独的一步。因此,它与我的答案并不完全相同 - 并不是说​​它在这种情况下无效:)
【解决方案2】:

您想要做的就是所谓的“组合树”或“in-tree binutils”构建。您可以找到有关如何处理 herethere 的文档。

【讨论】:

    猜你喜欢
    • 2013-12-25
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多