你的位置:首页 > 操作系统

[操作系统][原] 在 32bit openSuSE 上构建 GCC Cross Compiler for AArch64


 

转载请著明出处:http://www.cnblogs.com/shhuiw/


参考文档

        * http://jk.ozlabs.org/docs/arm64-toolchain/
          http://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
          http://www.tuicool.com/articles/YvQZfq
        * https://gcc.gnu.org/wiki/InstallingGCC
          http://gcc.gnu.org/install/prerequisites.html
          https://gcc.gnu.org/install/configure.html
          https://gcc.gnu.org/wiki/FAQ#configure
          http://wiki.osdev.org/GCC_Cross-Compiler
        * http://www.gnu.org/software/bihttp://www.tuicool.com/articles/YvQZfqnutils/
        * http://stackoverflow.com/questions/31392050/building-error-gcc-5-1-0-on-ubuntu

 

自己当前使用的是 32bit openSuSE,而现有的文章以及发行版提供的都是关于 64bit Linux 上的 cross toolchain 的。不打算重新装系统,毕竟要转移的资料太多。断断续续花了几天时间,参考网上各种资料,总算在 32bit openSuSE 上把 gcc cross compiler for AArch64 装上了。


设置安装目录
 

这里将安装目录设置为 /opt/cross/aarch64

        # mkdir -p /opt/cross/aarch64
        $ prefix=/opt/cross/aarch64/




安装 Prequisites


从源码编译 GCC,需要一些工具和库的支持(https://gcc.gnu.org/wiki/InstallingGCC #Support libraries),这些库在不同发行版上打包名字不同。这里使用的是 openSuSE:
        # zypper install bison flex gcc gcc-c++ mpfr-devel mpc-devel gmp-devel texinfo 


Fedora 也是类似
如果是 Ubuntu/Debian,可以尝试:
        $ sudo apt-get install bison flex gcc gcc-c++ libmpfr-dev libmpc-dev libgmp-dev texinfo


这里要安装 gcc-c++,是因为 make 时可能会报错:
        checking for int64_t underlying type... long long
        configure: error: error verifying int64_t uses long long


按照 http://stackoverflow.com/questions/31392050/building-error-gcc-5-1-0-on-ubuntu 中的方法安装 gcc-c++ 就可以解决了

 

构建安装 binutils

 


        $ git clone git://sourceware.org/git/binutils-gdb.git
        $ cd binutils-gdb
        binutils-gdb]$ ./configure --prefix=$prefix --target=aarch64-none-linux -disable-multilib
        binutils-gdb]$ make
        binutils-gdb]# make install          // 这里是 root 操作 



 

安装 kernel headers

 


        $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
        $ cd linux
        linux]# make ARCH=arm64 INSTALL_HDR_PATH=$prefix headers_install // 这里是 root 操作


构建安装 GCC


注意,当前 GCC 的配置编译不能在源码目录下直接进行(https://gcc.gnu.org/wiki/FAQ#configure),否则可能报错:
        Makefile:169: ../.././gcc/libgcc.mvars: No such file or directory
        make[2]: *** No rule to make target '../.././gcc/libgcc.mvars'.  Stop.


 

配置编译步骤如下:

        $ git clone git://gcc.gnu.org/git/gcc.git 
        $ mkdir gcc-build
        $ cd gcc-build
        gcc-build]$ ../gcc/configure --prefix=$prefix \
                        --target=aarch64-none-linux --enable-languages=c \
                        --disable-threads --disable-shared --disable-libmudflap \
                        --disable-libssp --disable-libgomp --disable-libquadmath \
                        --disable-libatomic
        gcc-build]$ make 
        gcc-build]# make install

    

如果配置编译过程中遇到问题,可以尝试一下稳定版本,比如 5.3
        $ wget http://www.netgull.com/gcc/releases/gcc-5.3.0/gcc-5.3.0.tar.bz2
        $ tar jxvf gcc-5.3.0.tar.bz2
        $ mkdir gcc-5.3-build
        $ cd gcc-5.3-build/
        gcc-5.3-build]$ 
        gcc-5.3-build]$ 
        gcc-5.3-build]$ ../gcc-5.3.0/configure --prefix=$prefix \
                        --target=aarch64-none-linux --enable-languages=c \
                        --disable-threads --disable-shared --disable-libmudflap \
                        --disable-libssp --disable-libgomp --disable-libquadmath \
                        --disable-libatomic
        gcc-5.3-build]$ make
        gcc-5.3-build]# make install


 


binutils/kernel-headers/gcc 编译安装完成后的目录布局


        # tree -L 1 /opt/cross/aarch64/
        /opt/cross/aarch64/
        ├── aarch64-none-linux
        ├── bin
        ├── include
        ├── lib
        └── share
        directories, 0 files


        # tree -L 2 /opt/cross/aarch64/
        /opt/cross/aarch64/
        ├── aarch64-none-linux
        │   ├── bin
        │   └── lib
        ├── bin
        │   ├── aarch64-none-linux-addr2line
        │   ├── aarch64-none-linux-ar
        │   ├── aarch64-none-linux-as
        │   ├── aarch64-none-linux-c++filt
        │   ├── aarch64-none-linux-cpp
        │   ├── aarch64-none-linux-elfedit
        │   ├── aarch64-none-linux-gcc
        │   ├── aarch64-none-linux-gcc-6.0.0
        │   ├── aarch64-none-linux-gcc-ar
        │   ├── aarch64-none-linux-gcc-nm
        │   ├── aarch64-none-linux-gcc-ranlib
        │   ├── aarch64-none-linux-gcov
        │   ├── aarch64-none-linux-gcov-tool
        │   ├── aarch64-none-linux-gdb
        │   ├── aarch64-none-linux-gprof
        │   ├── aarch64-none-linux-ld
        │   ├── aarch64-none-linux-ld.bfd
        │   ├── aarch64-none-linux-nm
        │   ├── aarch64-none-linux-objcopy
        │   ├── aarch64-none-linux-objdump
        │   ├── aarch64-none-linux-ranlib
        │   ├── aarch64-none-linux-readelf
        │   ├── aarch64-none-linux-run
        │   ├── aarch64-none-linux-size
        │   ├── aarch64-none-linux-strings
        │   └── aarch64-none-linux-strip
        ├── include
        │   ├── asm
        │   ├── asm-generic
        │   ├── drm
        │   ├── gdb
        │   ├── linux
        │   ├── misc
        │   ├── mtd
        │   ├── rdma
        │   ├── scsi
        │   ├── sound
        │   ├── uapi
        │   ├── video
        │   └── xen
        ├── lib
        │   ├── gcc
        │   ├── libaarch64-none-linux-sim.a
        │   ├── libcc1.la
        │   ├── libcc1.so -> libcc1.so.0.0.0
        │   ├── libcc1.so.0 -> libcc1.so.0.0.0
        │   └── libcc1.so.0.0.0
        └── share
            ├── gdb
            ├── info
            ├── locale
            └── man

        25 directories, 31 files


更新环境变量
 
        export PATH=$PATH:/opt/cross/aarch64/bin

这样就可以方便调用 aarch64-none-linux-*