手动编译、搭建arm 64-bit交叉编译链工具(详细)

环境:

  • 主机:windows 10 ,64bit
  • VMware: Pro 15
  • linux: ubuntu 18.04 , 64bit

下载4个源码包到/home/biren/crossbuild/src/目录下:

binutils-2.31.tar.bz2 , gcc-8.5.0.tar.gz , glibc-2.28.tar.bz2 , linux-5.5.15.tar.gz
新建3个对应编译用的文件夹:
build-binutils , build-gcc , build-glibc
在这里插入图片描述
解压4个源码包到各自的文件夹里:

biren@ubuntu:~/crossbuild/src$ tar xf binutils-2.31.tar.bz2 
biren@ubuntu:~/crossbuild/src$ tar xf gcc-8.5.0.tar.gz 
biren@ubuntu:~/crossbuild/src$ tar xf linux-5.5.15.tar.gz 
biren@ubuntu:~/crossbuild/src$ tar -jxf glibc-2.28.tar.bz2 

在这里插入图片描述

编译安装binutils :

命令:
…/binutils-2.31/configure ARCH=arm64 --prefix=/home/biren/crossbuild/toolchain --target=aarch64-linux-gnueabihf --disable-multilib

  • ARCH=arm64 目标程序用于arm64位架构
  • –prefix=/home/biren/crossbuild/toolchain 结果安装于此
  • –disable-multilib 仅支持64位的库
  • –target=aarch64-linux-gnueabihf 用交叉编译链工具编译出来的程序运行于aarch64架构的系统中
biren@ubuntu:~/crossbuild/src$ cd build-binutils/
biren@ubuntu:~/crossbuild/src/build-binutils$ ../binutils-2.31/configure ARCH=arm64 --prefix=/home/biren/crossbuild/toolchain --target=aarch64-linux-gnueabihf   --disable-multilib
biren@ubuntu:~/crossbuild/src$ make
biren@ubuntu:~/crossbuild/src$ make install

结果:
在这里插入图片描述
在这里插入图片描述

编译安装gcc(过渡) :

先下载编译gcc所用到的工具:
gmp-6.1.0.tar.bz2 , mpfr-3.1.4.tar.bz2,mpc-1.0.3.tar.gz,isl-0.18.tar.bz2
运行:./contrib/download_prerequisites 即可自动下载

biren@ubuntu:~/crossbuild/src/build-gcc$ cd ../gcc-8.5.0/
biren@ubuntu:~/crossbuild/src/gcc-8.5.0$ ./contrib/download_prerequisites 

2022-05-06 10:50:58 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840] -> "./gmp-6.1.0.tar.bz2" [1]
2022-05-06 10:51:07 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
2022-05-06 10:51:14 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925] -> "./mpc-1.0.3.tar.gz" [1]
2022-05-06 10:51:24 URL: ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291] -> "./isl-0.18.tar.bz2" [1]
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK
isl-0.18.tar.bz2: OK
All prerequisites downloaded successfully.

下载到gcc-8.5.0后还自动建立了链接:
在这里插入图片描述
命令:
…/gcc-8.5.0/configure ARCH=arm64 --prefix=/home/biren/crossbuild/toolchain --target=aarch64-linux-gnueabihf --enable-languages=c,c++ --disable-multilib

make all-gcc
make install-gcc

biren@ubuntu:~/crossbuild/src/build-binutils$ cd ../build-gcc/
biren@ubuntu:~/crossbuild/src/build-gcc$ ../gcc-8.5.0/configure ARCH=arm64 --prefix=/home/biren/crossbuild/toolchain --target=aarch64-linux-gnueabihf --enable-languages=c,c++  --disable-multilib
biren@ubuntu:~/crossbuild/src/build-binutils$ make all-gcc
biren@ubuntu:~/crossbuild/src/build-binutils$ make install-gcc

生成的部分文件:
在这里插入图片描述

配置路径path:

把toolchain/bin加入到path路径中

biren@ubuntu:~/crossbuild/src/build-gcc$ export PATH=/home/biren/crossbuild/toolchain/bin:$PATH

从Linux内核提取头文件:

命令:
make ARCH=arm64 INSTALL_HDR_PATH=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf headers_install
安装到此/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include目录下

biren@ubuntu:~/crossbuild/src/build-gcc$ cd ../linux-5.5.15/
biren@ubuntu:~/crossbuild/src/linux-5.5.15$ make ARCH=arm64 INSTALL_HDR_PATH=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf headers_install
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/unifdef
  WRAP    arch/arm64/include/generated/uapi/asm/kvm_para.h
  WRAP    arch/arm64/include/generated/uapi/asm/errno.h
  WRAP    arch/arm64/include/generated/uapi/asm/ioctl.h
。。。。。。
  HDRINST usr/include/asm/kvm_para.h
  HDRINST usr/include/asm/msgbuf.h
  INSTALL /home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include

在这里插入图片描述

编译安装glibc :

命令:
…/glibc-2.28/configure --prefix=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf --target=aarch64-linux-gnueabihf --with-headers=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include --build=$MACHTYPE --host=aarch64-linux-gnueabihf --disable-multilib libc_cv_forced_unwind=yes
其中:

  1. –with-headers=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include
    指定到上面产生的头文件位置
  2. –build=$MACHTYPE 编译程序的主机x86_64-pc-linux-gnu
  3. –host=aarch64-linux-gnueabihf 指向的是crossbuild/toolchain里的配置
  4. –disable-multilib 只产生对应的64位的库
  5. libc_cv_forced_unwind=yes 即 force-unwind 支持是可用的,不需要进行测试
    -nostdlib:不要搜索标准系统头文件目录,仅搜索-I指定的路径。
    -nostartfiles :连接的时候不使用标准系统的启动文件
    -x c : x指定输入的程序的语言,此时GCC不再根据文件的后缀名判断语言类型。
biren@ubuntu:~/crossbuild/src/linux-5.5.15$ cd ../build-glibc/
biren@ubuntu:~/crossbuild/src/build-glibc$ ../glibc-2.28/configure --prefix=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf --target=aarch64-linux-gnueabihf --with-headers=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include --build=$MACHTYPE --host=aarch64-linux-gnueabihf --disable-multilib libc_cv_forced_unwind=yes
biren@ubuntu:~/crossbuild/src/build-glibc$ make install-bootstrap-headers=yes install-headers
biren@ubuntu:~/crossbuild/src/build-glibc$ make  csu/subdir_lib
biren@ubuntu:~/crossbuild/src/build-glibc$ install csu/crt1.o csu/crti.o csu/crtn.o /home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/lib
biren@ubuntu:~/crossbuild/src/build-glibc$ aarch64-linux-gnueabihf-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/lib/libc.so
biren@ubuntu:~/crossbuild/src/build-glibc$ touch /home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include/gnu/stubs.h

问题一:
cpu-features.c:60:35: error: ‘glibc_tune_cpu’ undeclared (first use in this function); did you mean ‘glibc_tune_hwcaps’?

。。。
../sysdeps/unix/sysv/linux/aarch64/cpu-features.c: In function ‘init_cpu_features’:
../sysdeps/unix/sysv/linux/aarch64/cpu-features.c:60:35: error: ‘glibc_tune_cpu’ undeclared (first use in this function); did you mean ‘glibc_tune_hwcaps’?
   const char *mcpu = TUNABLE_GET (glibc, tune, cpu, const char *, NULL);
                                   ^~~~~
../elf/dl-tunables.h:65:46: note: in definition of macro ‘TUNABLE_ENUM_NAME1’
 # define TUNABLE_ENUM_NAME1(__top,__ns,__id) __top ## _ ## __ns ## _ ## __id
                                              ^~~~~
../elf/dl-tunables.h:94:21: note: in expansion of macro ‘TUNABLE_ENUM_NAME’
   tunable_id_t id = TUNABLE_ENUM_NAME (__top, __ns, __id);  
。。。
/home/biren/crossbuild/src/build-glibc/sysd-rules:9: recipe for target '/home/biren/crossbuild/src/build-glibc/csu/libc-start.o' failed
make[2]: *** [/home/biren/crossbuild/src/build-glibc/csu/libc-start.o] Error 1
make[2]: Leaving directory '/home/biren/crossbuild/src/glibc-2.28/csu'
Makefile:258: recipe for target 'csu/subdir_lib' failed
make[1]: *** [csu/subdir_lib] Error 2
make[1]: Leaving directory '/home/biren/crossbuild/src/glibc-2.28'
Makefile:9: recipe for target 'csu/subdir_lib' failed
make: *** [csu/subdir_lib] Error 2

原因:
是在configure参数里指定了ARCH,删除ARCH=arm64这个即可
…/glibc-2.28/configure ARCH=arm64 --prefix=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf --target=aarch64-linux-gnueabihf --with-headers=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include --build=$MACHTYPE --host=aarch64-linux-gnueabihf --disable-multilib libc_cv_forced_unwind=yes

问题二:
prctl.h:5:15: fatal error: asm/prctl.h: No such file or directory
#include_next <asm/prctl.h>

-DGEN_AS_CONST_HEADERS -x c - \
	-MD -MP -MF /home/biren/crossbuild/src/build-glibc/tcb-offsets.h.dT -MT '/home/biren/crossbuild/src/build-glibc/tcb-offsets.h.d /home/biren/crossbuild/src/build-glibc/tcb-offsets.h'
In file included from ../sysdeps/x86_64/nptl/tls.h:23:0,
                 from ../sysdeps/unix/sysv/linux/x86_64/sysdep.h:24,
                 from <stdin>:1:
../sysdeps/unix/sysv/linux/x86/include/asm/prctl.h:5:15: fatal error: asm/prctl.h: No such file or directory
 #include_next <asm/prctl.h>
               ^~~~~~~~~~~~~
compilation terminated.
../Makerules:287: recipe for target '/home/biren/crossbuild/src/build-glibc/tcb-offsets.h' failed
make[2]: *** [/home/biren/crossbuild/src/build-glibc/tcb-offsets.h] Error 1
make[2]: Leaving directory '/home/biren/crossbuild/src/glibc-2.28/csu'
Makefile:258: recipe for target 'csu/subdir_lib' failed
make[1]: *** [csu/subdir_lib] Error 2
make[1]: Leaving directory '/home/biren/crossbuild/src/glibc-2.28'
Makefile:9: recipe for target 'csu/subdir_lib' failed
make: *** [csu/subdir_lib] Error 2

解决:
在configure参数里加上–build=$ MACHTYPE --host=aarch64-linux-gnueabihf
…/glibc-2.28/configure --prefix=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf --target=aarch64-linux-gnueabihf --with-headers=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include --build=$MACHTYPE --host=aarch64-linux-gnueabihf --disable-multilib libc_cv_forced_unwind=yes

在build-gcc目录里编译安装libgcc:

biren@ubuntu:~/crossbuild/src/build-glibc$ cd ../build-gcc
biren@ubuntu:~/crossbuild/src/build-gcc$ make  all-target-libgcc
biren@ubuntu:~/crossbuild/src/build-gcc$ make install-target-libgcc

生成libgcc等相关文件:
在这里插入图片描述

继续安装glibc :

biren@ubuntu:~/crossbuild/src/build-gcc$ cd ../build-glibc/
biren@ubuntu:~/crossbuild/src/build-glibc$ make
biren@ubuntu:~/crossbuild/src/build-glibc$ make install
......
crossbuild/src/build-glibc/stubs.h
if test -r /home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include/gnu/stubs-lp64.h && cmp -s /home/biren/crossbuild/src/build-glibc/stubs.h /home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include/gnu/stubs-lp64.h; \
then echo 'stubs.h unchanged'; \
else /usr/bin/install -c -m 644 /home/biren/crossbuild/src/build-glibc/stubs.h /home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include/gnu/stubs-lp64.h; fi
rm -f /home/biren/crossbuild/src/build-glibc/stubs.h
make[1]: Leaving directory '/home/biren/crossbuild/src/glibc-2.28'

继续安装完整的gcc :

biren@ubuntu:~/crossbuild/src/build-glibc$ cd ../build-gcc
biren@ubuntu:~/crossbuild/src/build-gcc$ make
biren@ubuntu:~/crossbuild/src/build-gcc$ make install

查看gcc版本:

biren@ubuntu:~/crossbuild/toolchain/bin$ ./aarch64-linux-gnueabihf-gcc -v
Using built-in specs.
COLLECT_GCC=./aarch64-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/biren/crossbuild/toolchain/libexec/gcc/aarch64-linux-gnueabihf/8.5.0/lto-wrapper
Target: aarch64-linux-gnueabihf
Configured with: ../gcc-8.5.0/configure ARCH=arm64 --prefix=/home/biren/crossbuild/toolchain --target=aarch64-linux-gnueabihf --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 8.5.0 (GCC) 
biren@ubuntu:~/crossbuild/toolchain/bin$ file aarch64-linux-gnueabihf-gcc
aarch64-linux-gnueabihf-gcc: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=9f46ecc986c9e657f8e8796fc60c8d2da1be4707, with debug_info, not stripped

测试一下:

bin/aarch64-linux-gnueabihf-gcc testhello.c -o testhello

biren@ubuntu:~/crossbuild/toolchain$ touch testhello.c
biren@ubuntu:~/crossbuild/toolchain$ cat testhello.c 
#include <stdio.h>
int main(void)
{
	printf("Hello everyone! \n");
	return 0;
}

biren@ubuntu:~/crossbuild/toolchain$ bin/aarch64-linux-gnueabihf-gcc testhello.c -o testhello
biren@ubuntu:~/crossbuild/toolchain$ file testhello
testhello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, with debug_info, not stripped
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知行电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值