zoukankan      html  css  js  c++  java
  • 顺利编译 binutiles-gcc-glibc

    恩,前面一篇弃了,先知道怎么能成功,还有要避开哪些坑,然后再去仔细研究到底咋回事。

    这里顺利编译 arm-lfs-linux-gnueabi , 参考了下面的资料

    1. 《Linux From ScratchVersion 7.3》

    2. http://www.cnblogs.com/Charles-Zhang-Blog/archive/2013/02/21/2920999.html

    3. https://gcc.gnu.org/wiki/FAQ#configure

    4. http://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/

    就写这么多吧,其实还 google 了其它很多资料。上面资料重要性依次顺推。

    使用的源码列表

    1. binutils-2.22.tar.bz2, 补丁 binutils-2.22-build_fix-1.patch

    2. gcc-4.7.1.tar.bz2,编译中,有按照资料 1 做修改。

    3. linux-3.2.6.tar.xz

    4. glibc-2.16.0.tar.xz,补丁 glibc-2.16.0-res_query_fix-1.patch,ports 包 glibc-ports-2.16.0.tar.gz

    1. 编译 binutiles

    这里一般都很顺利,基本思路就是,利用本机的 gcc 和 binutiles,制作一个在本地执行的针对目标 CPU 的 binutiles。这里使用的配置选项有

    ../configure 
    --prefix=/tools 
    --with-sysroot=/mnt/lfs/ 
    --with-lib-path=/tools/lib 
    --target=arm-lfs-linux-gnueabi 
    --disable-nls

    这里也是有坑的,gnueabi 部分,这个命名是不可以自由发挥的,gcc 和 glibc 都会根据这个名字去做匹配。如果这个名字匹配不到,会出很多莫名其妙问题,比如,我开始的时候自己发挥的 gnueabihf,在编译 gcc 的时候,ld 总是提示找不到这找不到那。因为我后来查看( ld --verbose,查看 ld 的各种信息),这个版本的链接器只认这个:

    GNU ld (GNU Binutils) 2.22
      Supported emulations:
       armelf_linux_eabi
       armelfb_linux_eabi
    using internal linker script:
    ...

    它在链接的时候,认不了 eabihf。

    2. 编译 gcc

    事实上,我们要编译的 arm-lfs-linux-gnueabi-gcc 是在本机运行的,所以,它执行的环境使用本机的 gcc 和 binutiles 就可以构建。但是,arm-lfs-linux-gnueabi-gcc 里面有针对目标系统ld、as 的硬链接,所以,binutiles 要先准备好。另外,还不知道为什么,最近的工具链编译文档都推荐使用 -with-newlib。编译这个库是需要链接工具的。

    按照文档 1 所描述的方法,修改了 gcc 的源码。因为文档1只涉及 x86,所以,同样的,我还手动修改了$SRC/gcc/config/arm/ 下的 linux-eabi.h 和 linux-elf.h ,GLIBC_DYNAMIC_LINKER 的定义路径。

    然后,是我的配置选项:

    ../configure 
    --target=arm-lfs-linux-gnueabi 
    --prefix=/tools 
    --with-sysroot=/mnt/lfs/ 
    --with-newlib 
    --without-headers 
    --with-local-prefix=/tools 
    --with-native-system-header-dir=/tools/include 
    --disable-nls 
    --disable-shared 
    --disable-multilib 
    --disable-decimal-float 
    --disable-threads 
    --disable-libmudflap 
    --disable-libssp 
    --disable-libgomp 
    --disable-libquadmath 
    --enable-languages=c

    需要注意的是,target 要和上面 binutiles 的一致。编译过程中,配置脚本会去 $prefixe/bin 目录下,寻找同样前缀的 binutiles 工具。找不到,就会用本机的 binutiles,也不会提示错误,但是 make 就是各种有问题。

    另外,推荐下面的编译过程:

    make all-gcc
    make install all-gcc
    make all-target-libgcc
    make install-target-libgcc

    分步骤定位问题,如果是 all-target-ligbcc 无法编译,那估计是 linker 的问题(ld)。

    3. 准备 linux-header

    呵呵,参考了很多文档,大家取 linux-header 的手法都不一样,千奇百怪,还说要编译过才能取云云。

    继续参考文档 1 ,但是,我这里去的内核是跟我主机的版本内核一致的,并没选文档中推荐的版本。但是,另个差不多,应该关系不大。

    下载来内核包并解压后:

    make mrproper
    
    make headers_check
    make INSTALL_HDR_PATH=dest headers_install
    make ARCH=arm INSTALL_HDR_PATH=dest_arm headers_install

    然后,把 dest( dest_arm )目录下的文档拷贝到需要的地方即可。

    4. 编译 glibc

    按文档 1 的描述对代码进行了处理。这里主要是把 Makeconfig 文件中的 -lgcc_s 做了删除操作。因为我们的 gcc 是静态编译,并没有 libgcc.s ,但是,Makeconfig 其实是可以用我们在上一步产生的 libgcc.a 来完成编译的(也因为这,需要在 libgcc.a 同目录下,建一个软链接 libgcc_eh.a 到它)。

    下面是我的 configure 选项:

    ../configure 
    --prefix=/tools 
    --host=arm-lfs-linux-gnueabi 
    --build=$(../scripts/config.guess) 
    --disable-profile 
    --enable-add-ons 
    --enable-kernel=2.6.25 
    --with-headers=/tools/include 
    libc_cv_forced_unwind=yes 
    libc_cv_ctors_header=yes 
    libc_cv_c_cleanup=yes 
    libc_cv_arm_pcs_vfp=yes 
    libc_cv_arm_eabi=yes

    需要注意,这里会根据 --host=arm-lfs-linux-gnueabi 来选择编译 gcc 需要的工具!所以,我们要在这里 configure 之前,把前面工具的目录添加到 PATH 中:

    exprot PATH=$PATH:/tools/bin/

    make&make install

    同样,会因为工具链命名的问题,产生很多奇怪的错误。

    5. 工具连测试

    首先,如果可以顺利编译,起码是有一大半是成功的

    $ echo 'main(){}' > dummy.c
    $ arm-linux-gnueabi-gcc dummy.c
    $ readelf -l a.out| grep tools
    /tools/lib/ld-linux.so.3

    然后,看到连接库指向的是 /tools/lib/ld-linux.so.3 ,正是我们刚刚编译 glibc 得到的。

    另外,查看 /tools/lib/ld-linux.so.3 的 elf 信息,工具对 cpu 的支持情况等,也都一目了然。

    ...
    Version definition section '.gnu.version_d' contains 3 entries:
      Addr: 0x0000000000000608  Offset: 0x000608  Link: 4 (.dynstr)  000000: Rev: 1  Flags: BASE   Index: 1  Cnt: 1  Name: ld-linux.so.3
      0x001c: Rev: 1  Flags: none  Index: 2  Cnt: 1  Name: GLIBC_2.4
      0x0038: Rev: 1  Flags: none  Index: 3  Cnt: 2  Name: GLIBC_PRIVATE
      0x0054: Parent 1: GLIBC_2.4
    Attribute Section: aeabi
    File Attributes
      Tag_CPU_name: "ARM10TDMI"
      Tag_CPU_arch: v5T
      Tag_ARM_ISA_use: Yes
      Tag_THUMB_ISA_use: Thumb-1
      Tag_ABI_PCS_wchar_t: 4
      Tag_ABI_FP_rounding: Needed
      Tag_ABI_FP_denormal: Needed
      Tag_ABI_FP_exceptions: Needed
      Tag_ABI_FP_number_model: IEEE 754
      Tag_ABI_align_needed: 8-byte
      Tag_ABI_align_preserved: 8-byte, except leaf SP
      Tag_ABI_enum_size: int
      Tag_ABI_optimization_goals: Aggressive Speed
      Tag_DIV_use: Not allowed

    因为这个过程中,并没有指定 CPU 的信息,所以,默认 ARM10TDMI 这个适应性最广的内核。但是,还不知道这里为什么 GLIBC 的版本是 2.4?不过,看了手上几个交叉编译工具,他们 ld-linux.so.x 文件,打印出的也都是 GLIBC_2.4。

    不确定的话,还可以用 gcc -v dummy.c 来看看 compile 和 link 的详细搜索信息:

    Using built-in specs.
    COLLECT_GCC=/tools/bin/arm-lfs-linux-gnueabi-gcc
    COLLECT_LTO_WRAPPER=/mnt/lfs/tools/bin/../libexec/gcc/arm-lfs-linux-gnueabi/4.7.1/lto-wrapper
    Target: arm-lfs-linux-gnueabi
    Configured with: ../configure --target=arm-lfs-linux-gnueabi --prefix=/tools --with-sysroot=/mnt/lfs/ --with-newlib --without-headers --with-local-prefix=/tools --with-native-system-header-dir=/tools/include --disable-nls --disable-shared --disable-multilib --disable-decimal-float --disable-threads --disable-libmudflap --disable-libssp --disable-libgomp --disable-libquadmath --enable-languages=c
    Thread model: single
    gcc version 4.7.1 (GCC) 
    COLLECT_GCC_OPTIONS='-v' '-mtls-dialect=gnu'
     /mnt/lfs/tools/bin/../libexec/gcc/arm-lfs-linux-gnueabi/4.7.1/cc1 -quiet -v -iprefix /mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/ dummy.c -quiet -dumpbase dummy.c -mtls-dialect=gnu -auxbase dummy -version -o /tmp/ccM0ks0K.s
    GNU C (GCC) version 4.7.1 (arm-lfs-linux-gnueabi)
        compiled by GNU C version 4.6.3, GMP version 4.3.2, MPFR version 2.4.2, MPC version 0.8.1
    GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
    ignoring nonexistent directory "/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/../../../../arm-lfs-linux-gnueabi/include"
    ignoring duplicate directory "/mnt/lfs/tools/bin/../lib/gcc/../../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/include"
    ignoring duplicate directory "/mnt/lfs/tools/bin/../lib/gcc/../../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/include-fixed"
    ignoring nonexistent directory "/mnt/lfs/tools/bin/../lib/gcc/../../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/../../../../arm-lfs-linux-gnueabi/include"
    ignoring duplicate directory "/mnt/lfs/tools/include"
    #include "..." search starts here:
    #include <...> search starts here:
     /mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/include
     /mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/include-fixed
     /mnt/lfs/tools/include
    End of search list.
    GNU C (GCC) version 4.7.1 (arm-lfs-linux-gnueabi)
        compiled by GNU C version 4.6.3, GMP version 4.3.2, MPFR version 2.4.2, MPC version 0.8.1
    GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
    Compiler executable checksum: 8984c53ee8f338d4ee7617f8ba4e1a93
    COLLECT_GCC_OPTIONS='-v' '-mtls-dialect=gnu'
     /mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/../../../../arm-lfs-linux-gnueabi/bin/as -v -meabi=5 -o /tmp/ccNzMZcr.o /tmp/ccM0ks0K.s
    GNU assembler version 2.22 (arm-lfs-linux-gnueabi) using BFD version (GNU Binutils) 2.22
    COMPILER_PATH=/mnt/lfs/tools/bin/../libexec/gcc/arm-lfs-linux-gnueabi/4.7.1/:/mnt/lfs/tools/bin/../libexec/gcc/:/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/../../../../arm-lfs-linux-gnueabi/bin/
    LIBRARY_PATH=/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/:/mnt/lfs/tools/bin/../lib/gcc/:/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/../../../../arm-lfs-linux-gnueabi/lib/:/mnt/lfs/tools/lib/
    COLLECT_GCC_OPTIONS='-v' '-mtls-dialect=gnu'
     /mnt/lfs/tools/bin/../libexec/gcc/arm-lfs-linux-gnueabi/4.7.1/collect2 --sysroot=/mnt/lfs/ --eh-frame-hdr -dynamic-linker /tools/lib/ld-linux.so.3 -X -m armelf_linux_eabi /mnt/lfs/tools/lib/crt1.o /mnt/lfs/tools/lib/crti.o /mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/crtbegin.o -L/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1 -L/mnt/lfs/tools/bin/../lib/gcc -L/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/../../../../arm-lfs-linux-gnueabi/lib -L/mnt/lfs/tools/lib /tmp/ccNzMZcr.o -lgcc -lc -lgcc /mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/crtend.o /mnt/lfs/tools/lib/crtn.o

    6. 根据编译好的 glibc 来重做工具

    写不下去了,不知道接下来要干啥哈哈哈,随便倒腾倒腾。继续制作指向新 libc 库的 gcc 和 binutils ?

    还有改掉那个 linker 的路径。

    反正,目标是用自制的工具作出自己的系统来,所以,还有蛮多工作要做。

    7. 修改 lib 路径重新编译

    这次编译就是使用工具默认的路径,没有制定 include,也没有指定 lib。使用的文件和上面一样(没有改变 gcc/config/arch/linux-**.h 里的 program interpreter,保持原来的 ld-linux.so.*),改变 configure 选项如下。同样是成功可用的。

    ../configure 
    --prefix=/tmp/toolchains/ 
    --target=arm-lfs-linux-gnueabi 
    --disable-nls
    -------------------------------------------------------------------------------
    ../configure 
    --target=arm-lfs-linux-gnueabi 
    --prefix=/tmp/toolchains/ 
    --with-newlib 
    --without-headers 
    --disable-nls 
    --disable-shared 
    --disable-multilib 
    --disable-decimal-float 
    --disable-threads 
    --disable-libmudflap 
    --disable-libssp 
    --disable-libgomp 
    --disable-libquadmath 
    --enable-languages=c,c++
    -------------------------------------------------------------------------------
    exprot PATH=$PATH:/tmp/toolchains/bin/
    
    ../configure 
    --prefix=/tmp/toolchains/arm-lfs-linux-gnueabi/ 
    --host=arm-lfs-linux-gnueabi 
    --build=$(../scripts/config.guess) 
    --disable-profile 
    --enable-add-ons 
    --enable-kernel=2.6.25 
    libc_cv_forced_unwind=yes 
    libc_cv_ctors_header=yes 
    libc_cv_c_cleanup=yes 
    libc_cv_arm_pcs_vfp=yes 
    libc_cv_arm_eabi=yes

    测试工具,查看 program interpreter 都没有问题。

  • 相关阅读:
    产品需求说明书PRD模版
    会编程的 AI + 会修 Bug 的 AI,等于什么 ?
    会编程的 AI + 会修 Bug 的 AI,等于什么 ?
    会编程的 AI + 会修 Bug 的 AI,等于什么 ?
    luogu P1164 小A点菜
    luogu P1347 排序
    luogu P1195 口袋的天空
    luogu P1182 数列分段Section II
    luogu P1332 血色先锋队
    luogu P1983 车站分级
  • 原文地址:https://www.cnblogs.com/pied/p/6604962.html
Copyright © 2011-2022 走看看