编译binutils和gcc的配方是什么?

29
根据GCC构建说明,您可以同时构建binutils、gcc(以及gmp, mpc等)。以下是该页面的内容:

如果您还打算构建binutils(无论是升级现有安装还是用于替换操作系统对应的工具),请将binutils分发包解压缩到与GCC源代码相同的目录或其它目录。在后一种情况下,请向任何您打算和编译器一起构建的binutils组件(bfd、binutils、gas、gprof、ld、opcodes等)添加符号链接,链接到包含GCC源代码的目录。

同样,GMP、MPFR和MPC库也可以自动与GCC一起构建。将GMP、MPFR和/或MPC源代码分发包解压缩到包含GCC源代码的目录中,并将它们的目录重命名为gmp、mpfr和mpc,或使用相同名称的符号链接。

这适用于gmp、mpc、mpfr,但我似乎无法将其全部构建为binutils。我也无法找出如何从binutils构建新的gold链接器。相关版本是gcc-4.4.2和binutils-2.20。
希望能提供一步步的指导(不仅仅是对我,也是对其他遇到这个问题的人)。

你可能也会对查看LFS(Linux From Scratch)的做法感兴趣。它使用了一个二步引导程序来构建binutils、GCC和glibc(另一个重要的GCC依赖项)。 - Ciro Santilli OurBigBook.com
2个回答

31

这应该仍然被支持,因为它通常用于构建交叉编译器。

事实上,我刚刚使用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 ...(在此处解压缩其他文件,观察文件列表滚动)

  • cd gcc-4.6.0并创建不带版本号的gmp、mpc和mpfr目录的符号链接,例如:

    ln -s ../gmp-5.0.2 gmp

  • 现在从binutils目录中创建所有不存在于gcc目录中的符号链接,因此任何已经存在的内容都将优先考虑,但是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 ...(这里有很多binutils的符号链接,以及现有的gcc内容) gmp-5.0.2/ mpc-0.9/ mpfr-3.0.1/

  • 从此目录配置整个内容,并传递给configure所需的任何选项:

    ../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`

当然,在将其释放到您的代码库之前,还要测试已安装版本是否能够成功构建可执行文件,并进行一些简单示例的测试 :)

编辑:下面的评论包含已知可以一起使用的版本组合。并非所有组合都有效,因此您可能需要尝试不同于上述组合的其他组合。

较晚的编辑:在与C、C++、Fortran语言集良好地构建在一起时,gcc 13.1.0、binutils 2.40、gdb 13.1、cloog 0.18.1、isl 0.24、gmp 6.1.0、mpc 1.2.1、mpfr 4.1.0均能够很好地构建在一起。

最后,可以像binutils一样将gdb包含在本构建中(需要兼容的组件版本,请参见注释),只需在binutils之后添加以下内容:for f in ../gdb-8.1.1/* ; do ln -s "${f}" ; done,构建会自动加入gdb。


2
一个备忘录:在使用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) - David Gardner
2
另外注意:使用gcc 4.7.2,binutils-2.22和gmp、mpc、mpfr的contrib/download_prerequisites进行此操作;该方法有效,但是使用-flto编译时gcc无法构建,导致出现错误:collect2: fatal error: cannot find 'ld'。为了解决这个问题,在您的...prefix/bin目录中创建一个符号链接ld -> ld-new。 - Dmitry Chichkov
2
gcc 4.9 构建适用于: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 存储库的当前开发版本中得到修复) - David Gardner
1
我从回答中删除了指向osdev网站矩阵的链接,该矩阵用于交叉编译器gcc/binutils版本兼容性(osdev.org有一个大型的binutils / GCC兼容性矩阵),因为它在几个方面都不同:(1)它是构建交叉编译器gcc,其对版本有不同的限制,(2)binutils构建不与gcc构建合并在树中,而是在之前的一个单独步骤中进行。因此,它与我的答案不完全相同-并不是说在那种情况下它无效 :) - David Gardner
关于信息:如果您使用download_prerequisites脚本以及与gcc源代码下载一起的“基础设施”目录中的版本,那么cloog、isl、mpc、mpfr、gmp的版本实际上是构建所必需且经过测试的唯一版本...我应该改变这些说明以反映这一点! - David Gardner
显示剩余11条评论

6
你想要做的是所谓的“合并树”或“内部binutils”构建。你可以在这里找到有关如何进行的文档此处那里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接