26

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

这是该页面的内容:

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

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

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

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

4

2 回答 2

28

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

事实上,我刚刚使用 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这里使用 orso 来获得一些并行构建,因为这需要一段时间):

    make -j4 ; make install
    

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

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

    `which gcc`

    `which as`

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

    `gcc --version`

    `as --version`

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

编辑:下面的评论包含一些已知可以一起工作的版本。并非所有组合都有效,因此您可能需要对提到的不同组合进行一些试验和错误!

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

于 2011-06-03T14:44:55.330 回答
4

您想要做的称为“组合树”或“in-tree binutils”构建。您可以在这里那里找到有关如何进行的文档。

于 2010-03-10T15:38:07.947 回答