环境:
- 主机: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
其中:
- –with-headers=/home/biren/crossbuild/toolchain/aarch64-linux-gnueabihf/include
指定到上面产生的头文件位置 - –build=$MACHTYPE 编译程序的主机x86_64-pc-linux-gnu
- –host=aarch64-linux-gnueabihf 指向的是crossbuild/toolchain里的配置
- –disable-multilib 只产生对应的64位的库
- 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