从源码交叉编译ARM-LINUX-GCC
⽬录
问题描述
本⽂适⽤于想要更改released的arm-linux-gcc的⼀些配置选项,来⽣成⾃⼰独特配置的交叉编译器,⽐如说 arm-linux-aarch64-gfortran 等等。
因为Linaro公司发⾏的所有arm-linux-gnueabihf-系列的交叉编译器的默认配置中,其中⼀项configure是--with-mode=thumb,⽽我需要gcc将所有的库⽂件都编译为arm版本,因此只好⾃⼰编译gcc。
宿主机环境
我的宿主机是Linux Ubuntu 32位,编译⽬标是⽣成--with-mode=arm的32位交叉编译器:arm-linux-gnueabihf-gcc, arm-linux-gnueabihf-g++, arm-linux-gnueabihf-gfortran。
1. 本博客也同样适⽤于64位的环境,⼤家可以放⼼复制粘贴(狗头)。话不多说,开始硬核编译
源码编译
1. 编译环境安装
在正式进⼊编译之前,需要对宿主机进⾏安装⼀些环境,需要的环境有gcc, make, gawk,这些包的话直接install就好了,不必源码安装:sudo apt-get install gcc make gawk
确保这些环境的存在我们就可以正式开始安装了。
2. 依赖包及GCC源码下载
在确保宿主机有⽹的情况下,我们需要下载以下的gcc依赖包,gcc源码来源于Linaro,可以根据⾃⼰的需要⾃⾏下载需要的版本,我这⾥随便选了个gcc 5.5,⽹址:
binutil以及glibc都是编译gcc最重要的依赖库,Linux kernel是⽤来获取gcc使⽤的⼀些头⽂件,其余的⼏个分别也都是对gcc的优化选项的编译,为了达到与发⾏的gcc编译器有相同的功能,后⾯的⼏个也建议都进⾏安装。
3. 编译
3.1. 解压
for f in *.tar*; do tar xf $f; done
3.2. 编译
注意在编译过程中,只能按照编译顺序进⾏编译,顺序不⼀致的话,gcc会编译失败
3.2.1 建⽴链接
将gcc编译所使⽤的包全部都与gcc源代码⽬录链接起来,这样我们在后⾯编译的时候就不需要⼿动对这些包就⾏编译了
mv gcc-linaro-5.5-2017.10 gcc-5.5
cd gcc-5.5
ln -s …/mpfr-3.1.2 mpfr
ln -s …/gmp-6.0.0 gmp
ln -s …/mpc-1.0.2 mpc
ln -s …/isl-0.12.2 isl
ln -s …/cloog-0.18.1 cloog
cd …
这⾥的所有…都应该是两个点,垃圾CSDN不识别
3.2.2 ⽬标⽬录⽣成
mkdir -p /opt/corss
chown yourself /opt/cross
3.2.3 binutils 编译
export PATH=/opt/cross/:$PATH
mkdir build-binutils
cd build-binutils
…/binutils-2.24/configure --prefix=/opt/cross --target=your-target --disable-multilib
make -j 4
make install
cd …/
⽣成binutils包,最关键的地⽅就是你的target,可以使⽤../binutils-2.24/configure --target-help来查看你想要的target名字
3.2.4 linux kernel 编译
cd linux-3.17.2
make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross/your-prefix headers_install
cd …
header 头⽂件放在了/opt/cross然后⾃⼰的target⽬录之下,⽐如说我的就是/opt/cross/arm-linux,其余不需要改动
3.2.5 gcc 编译
gcc总共需要编译3次,这是因为需要第⼀次使⽤编译好的gcc去编译target架构所使⽤的的库⽂件,然
后再使⽤编译好的库⽂件再次编译其余gcc所需要的库⽂件。
在第⼀次编译中,因为要⽣成configure⽂件,往后的编译都是根据configure⽂件来编译,所以在这⾥才是真正意义上的DIY编译,你可以加⼊你⾃⼰所需要的的⼀些选项,这⾥我就加⼊了⾃⼰的选项。
第⼀次编译:
mkdir -p build-gcc
cd build-gcc
…/gcc-5.5/configure --prefix=/opt/cross --target=your-target --enable-languages=c,c++,fortran --disable-multilib --with-mode=arm --with-float-hard
make -j 4 all-gcc
make install-gcc
cd …
--target与编译binutils时额选项还⼀样的
--enable-language可以⾃⼰选,⼀般为c c++ fortran,当然你也可以只编译前两个
3.2.6 glibc 编译linux下gcc编译的四个步骤
mkdir -p build-glibc
cd build-glibc
…/glibc-2.20/configure --prefix=/opt/cross/arm-linux-gnueabihf --build=$MACHTYPE --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --with-headers=/opt/cross/arm-linux-gnueabihf/include --disable-multilib
libc_cv_forced_unwind=yes
make install-bootstrap-headers=yes install-headers
make -j 4 csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /opt/cross/arm-linux-gnueabihf/lib
arm-linux–gnueabihf-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /opt/cross/arm-linux-gnueabih
f/lib/libc.so touch /opt/cross/arm-linux-gnueabihf/include/gnu/stubs.h
cd …
这⼀步是最复杂的,所以我把我的命令完全放了出来,⼤家看着改,主要就还是⼀些prefix和target的选项要改成⾃⼰的,–build选项不要改,这个选项是系统默认的。install过后应该就没有问题,容易出错的地⽅在于make
3.2.7 gcc 编译
使⽤编译好的glibc 第⼆次编译gcc
cd build-gcc
make -j 4 all-target-libgcc
make install-target-libgcc
cd …
3.2.8 C 标准库编译
cd build-glibc
make -j 4
make install
cd …
3.2.9 gcc 编译
C的标准库编译完之后,需要编译C++的标准库,也就是最后⼀次编译gcc了
cd build-gcc
make -j 4
make install
cd …
4. 检查
/
opt/cross/bin下有编译好的所有gcc,⽐如说arm-linux-gnueabihf-gfortran,如图,可以看到我⾃⼰写的gcc 配置选项 --with-mode=arm --with-float=hard等等:
5. 最后
肯定会有各种各样的编译问题的,怎么解决呢??
我的建议是 直接原地重新开始编译,对就是从第⼀步开始
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论