[原] 在 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
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/
$ 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
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 操作
$ 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 操作
$ 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.
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
$ 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
$ 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
/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-* 了
浙公网安备 33010602011771号