添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 主机: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
                    环境:主机:windows 10 ,64bitVMware: Pro 15linux: 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个源
				
以前将android的kernel拿出来单独编译交叉编译器也是从android代码中拿出来的。 但自从装了Ubuntu 12.04 64位系统之后,原来在32位系统上可以使用的arm-linux交叉编译器不能用了。 按照网上的方法安装 sudo apt-get install ia32-libs 结果却提示依赖关系不能满足。 想从android代码里提取出64位交叉编译器,结果编译内核报错,才发现提取出来的交叉编译器中大部分是64位的,可objcopy却是32位的,我想不通为什么。 我只能找个64位的objcopy代替,好不容易找到了,替换成64位的objcopy,很好用, GCC版本:gcc version 4.7.3 (CodeBench Lite 2013.05-23 - rebuilt by Lxz) objcopy版本:GNU objcopy (CodeBench Lite 2013.05-23 - rebuilt by Lxz) 2.23.52.20130219
glibc = GNU C Library 是GNU项(GNU Project)目,所实现的 C语言标准库(C standard library)。 目前,常见的桌面和服务器中的GNU/Linux类的系统中,都是用的这套C语言标准库。 其实现了常见的C库的函数,支持很多种系统平台,功能很全,但是也相对比较臃肿和庞大。 2.uClibc 一个小型的C语言标准库,主要用于嵌入式。 其最开始设计用于uClinux(注:uClinux不支持MMU),因此比较适用于微处理器中。 对应的,此处的u意思是μ,Micro,微小的意思。 uClibc的特点: (1)uClibc比glibc要小很多。 (2)uClibc是独立的,为了应用于嵌入式系统中,完全重新实现出来的。和glibc在源码结构和二进制上,都不兼容。 3.EGLIBC EGLIBC = Embedded GLIBC EGLIBC是,(后来)glibc的原创作组织FSF所(新)推出的,glibc的一种变体,目的在于将glibc用于嵌入式系统。 EGLIBC的目标是: (1)保持源码和二进制级别的兼容于Glibc 源代码架构和ABI层面兼容 如果真正实现了这个目标,那意味着,你之前用glibc编译的程序,可以直接用eglibc替换,而不需要重新编译。 这样就可以复用之前的很多的程序了。 (2)降低(内存)资源占用/消耗 (3)使更多的模块为可配置的(以实现按需裁剪不需要的模块) (4)提高对于交叉编译(cross-compilation)和交叉测试(cross-testing)的支持 【目前了解到的海思交叉编译工具的应用环境】 arm-hisiv100-linux为基于uclibc的工具arm-hisiv200-linux 为基于 glibc 的工具arm-hisiv300-linux为基于uclibc的工具arm-hisiv400-linux 为基于 glibc 的工具arm-hisiv500-linux为基于uclibc的工具arm-hisiv600-linux 为基于 glibc 的工具。 (在开发的时候,你编译内核所用的交叉编译跟用户的应用程序所用的交叉编译一定需要相同,不然没法调用系统内核的依赖库) 其中eglibc这种很容易被人开发者忽视,从而选错了编译工具。 uClibc和Glibc并不相同,两者有许多不同之处,有可能给你带来一些问题。 一、源码编译安装gcc-4.9.2 1、下载gcc源码包 Download (HTTP): http://ftp.gnu.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.gz 2、解压压缩包 tar -zxvf gcc-4.9.2.tar.gz 3、下载编译所需的依赖包 这个步骤有两种方式
虚拟机vmware linux的piix4_smbus : SMBus Host Controller not enabled、空间不足引起不能启动的问题 w3222371135: 遇到这种问题也是够奇葩的,离谱 手机安装gcc,编译c程序(unyaffs解压/包工具) 竹林-小溪: 博主,可以再分享下gcc压缩包的链接吗,前面那个失效了 虚拟机vmware linux的piix4_smbus : SMBus Host Controller not enabled、空间不足引起不能启动的问题 “cd ../”一下 虚拟机vmware linux的piix4_smbus : SMBus Host Controller not enabled、空间不足引起不能启动的问题 你不应该在root用户下找。root和home是同一级目录。 虚拟机vmware linux的piix4_smbus : SMBus Host Controller not enabled、空间不足引起不能启动的问题 HanyJie: 看了您的博客问题解决了,感谢