编制binutils& amp; gcc在一起?

时间:2009-11-12 23:08:03

标签: gcc bootstrapping binutils

根据gcc build instructions,您可以与构建gcc(以及gmp,mpc等)同时构建binutil。

以下是该页面的内容:

  

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

     

同样是GMP,MPFR和MPC   库可以自动构建   与GCC一起。打开GMP包装,   MPFR和/或MPC源分布   在包含GCC的目录中   来源并重命名他们的目录   分别为gmp,mpfr和mpc(或   使用符号链接   名称)。

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

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

3 个答案:

答案 0 :(得分:26)

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

事实上,我刚刚使用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
    
  • 现在符号链接来自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
       ... (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中,则可能是LD目标到LD_LIBRARY_PATH,如make install中有关安装库的消息中所述步骤),一切都应该在这个新版本上运行。

一旦你打开一个新的shell,你可能需要检查一下你是否正在使用这个已安装的版本:

    `which gcc`

    `which as`

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

    `gcc --version`

    `as --version`

..以及(当然)测试已安装的版本使用一些简单的示例构建可执行文件,然后再将其放在代码库中:)

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

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

答案 1 :(得分:4)

您想要做的是称为“组合树”或“树内binutils”构建。您可以找到有关如何继续herethere的文档。

答案 2 :(得分:-1)

我总是分开建造一切。在构建并安装binutils之后,只要为每个配置脚本提供相同的--target--prefix选项,gcc就可以正常构建:

的binutils:

$ ./configure --target=XYZ --prefix=/abc/def
$ make all install

然后添加路径(如有必要):

$ export PATH="$PATH:/abc/def/bin"

并构建gcc:

$ ./configure --target=XYZ --prefix=/abc/def
$ make all-gcc install-gcc

然后在必要时构建你的libc和gcc的其余部分(也许是调试器!)。