转载请著明出处: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-* 了