参考

Building GCC as a cross compiler for Raspberry Pi

How to Build a GCC Cross-Compiler

环境

PC: ubuntu18.04 64位 (Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz)

GCC:gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)

正文

下面是我们交叉编译GCC用到的三个软件包:binutils,glibc以及gcc,下载链接如下:

binutils:https://mirrors.nju.edu.cn/gnu/binutils/,我下载的是binutils-2.32.tar.xz

glibc:https://ftp.gnu.org/gnu/glibc/,我下载的是glibc-2.30.tar.xz

gcc:https://github.com/gcc-mirror/gcc,我下载的是:gcc-9_2_0-release (切到tag标签,选择对应的tag)

1、安装编译必备的软件包

sudo apt update
sudo apt upgrade
sudo apt install build-essential gawk git texinfo bison flex

2、新建路径,下面的所有操作都需要在一个终端里完成,以免环境变量发生变化

mkdir -p /home/pengdl/work/GNU/mk_cross_compiler/
cd /home/pengdl/work/GNU/mk_cross_compiler

3、下载软件包并解压

$ pwd
/home/pengdl/work/GNU/mk_cross_compiler
$ mkdir code
$ cd code
$ tar -xf ./binutils-2.32.tar.xz-
$ tar -xf ./glibc-2.30.tar.xz-
$ tar -xf ./gcc-9_2_0-release.tar.gz

4 、进入刚解压的GCC源码目录,下载依赖的软件包

cd gcc-9_2_0/
./contrib/download_prerequisites

5、创建存放交叉编译可执行程序的路径,并加入PATH中

cd /home/pengdl/work/GNU/mk_cross_compiler
mkdir cross-gcc
export PATH=/home/pengdl/work/GNU/mk_cross_compiler/cross-gcc/bin:$PATH

6、安装内核头文件,这样将来就可以用自己的交叉编译工具编译调用对应kernel的系统调用的应用程序

cd /home/pengdl/aarch64/android_kernel/linux-4.14
make ARCH=arm64 INSTALL_HDR_PATH=/home/pengdl/work/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu headers_install

建议按照下面的方式,将代码和编译放到不同的路径下进行!!!!

7、编译安装binutils

cd /home/pengdl/work/GNU/mk_cross_compiler
mkdir build-binutils
cd build-binutils/
../code/binutils-2.32/configure --prefix=/home/pengdl/work/GNU/mk_cross_compiler/cross-gcc --target=aarch64-linux-gnu --disable-multilib --with-arch=armv8
make -j8
make install

下面开始编译glibc和gcc,由于这两个相互依赖,所以我们先部分编译gcc,然后部分编译glibc,最后全部编译gcc和glibc。

8、部分编译gcc

cd /home/pengdl/work/GNU/mk_cross_compiler
mkdir build-gcc
cd build-gcc
../code/gcc-9_2_0/configure --prefix=/home/pengdl/work/GNU/mk_cross_compiler/cross-gcc --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-multilib
make all-gcc -j8
make install-gcc

9、部分编译glibc

cd /home/pengdl/work/GNU/mk_cross_compiler
mkdir build-glibc
cd build-glibc/
../code/glibc-2.30/configure --prefix=/home/pengdl/work/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu --build=$MACHINE --host=aarch64-linux-gnu --target=aarch64-linux-gnu --with-headers=/home/pengdl/work/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu/include --disable-multilib libc_cv_forced_unwind=yes make install-bootstrap-headers=yes install-headers
make -j8 csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /home/pengdl/work/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu/lib
aarch64-linux-gnu-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /home/pengdl/work/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu/lib/libc.so
touch /home/pengdl/work/GNU/mk_cross_compiler/cross-gcc/aarch64-linux-gnu/include/gnu/stubs.h

10、修改GCC 9.2的源码,否则编译会报错

修改/home/pengdl/work/GNU/mk_cross_compiler/code/gcc-9_2_0/libsanitizer/asan/asan_linux.cc,在第77行加入如下代码:

#ifndef PATH_MAX
#define PATH_MAX 4096
#endif

11、接着部分编译gcc

cd /home/pengdl/work/GNU/mk_cross_compiler/build-gcc
make -j8 all-target-libgcc
make install-target-libgcc

12、全编译glibc

cd /home/pengdl/work/GNU/mk_cross_compiler/build-glibc
make -j8
make install

13、全编译gcc

cd /home/pengdl/work/GNU/mk_cross_compiler/build-gcc
make -j8
make install

14、测试

首先查看一下我们自己编译生成的gcc版本:

$ aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/home/pengdl/work/GNU/mk_cross_compiler/cross-gcc/libexec/gcc/aarch64-linux-gnu/9.2./lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../code/gcc-9_2_0/configure --prefix=/home/pengdl/work/GNU/mk_cross_compiler/cross-gcc --target=aarch64-linux-gnu --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 9.2. (GCC)

编写一个hello_world.c:

$ cat hello_world.c
#include <stdio.h> int main(int argc, const char *argv[])
{
printf("Hello World\n");
return ;
}

编译测试:

$ aarch64-linux-gnu-gcc --static hello_world.c -o hello_world
$ qemu-aarch64 ./hello_world
Hello World

完。

交叉编译用于生成aarch64指令的GCC (9.2)的更多相关文章

  1. myeclipse(2015)中创建简单的Maven项目的步骤(用于生成可执行jar文件)------》myeclipse2015

    利用MyEclipse的引导,可以很方便的创建简单的.用于生成可执行jar文件的Maven项目: 1.New -> Project... 选择 Maven Project, 点击Next > ...

  2. CROSS JOIN连接用于生成两张表的笛卡尔集

    将两张表的情况全部列举出来 结果表: 列= 原表列数相加 行= 原表行数相乘     CROSS JOIN连接用于生成两张表的笛卡尔集. 在sql中cross join的使用: 1.返回的记录数为两个 ...

  3. 机器学习进阶-直方图与傅里叶变化-直方图均衡化 1.cv2.equalizeHist(进行直方图均衡化) 2. cv2.createCLAHA(用于生成自适应均衡化图像)

    1. cv2.equalizeHist(img)  # 表示进行直方图均衡化 参数说明:img表示输入的图片 2.cv2.createCLAHA(clipLimit=8.0, titleGridSiz ...

  4. 四、dbms_alert(用于生成并传递数据库预警信息)

    1.概述 作用:用于生成并传递数据库预警信息.使用包DBMS_ALERT,则必须以SYS登陆,为该用户授予执行权限.sql>conn sys/oracle as sysdbasql>gra ...

  5. 图文介绍MyEclipse (2015) 中创建简单的Maven项目的步骤(用于生成可运行jar文件)

    利用MyEclipse的引导,能够非常方便的创建简单的.用于生成可运行jar文件的Maven项目: (原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/cl ...

  6. 个人永久性免费-Excel催化剂功能第36波-新增序列函数用于生成规律性的循环重复或间隔序列

    啃过Excel函数的表哥表姐们,一定对函数的嵌套.数组公式等高级的应用有很深的体会,威力是大,但也烧死不少脑细胞,不少人就在这样的绕函数中光荣地牺牲了,走向从入门到放弃.Excel催化剂的创立,初衷就 ...

  7. 使用-MM生成include指令和依赖生成(make include directive and dependency generation with -MM)

    I want a build rule to be triggered by an include directive if the target of the include is out of d ...

  8. Java实例练习——java实现自动生成长度为10以内的随机字符串(可用于生成随机密码)

    package sorttest; import java.util.ArrayList; import java.util.Collections; import java.util.List; i ...

  9. 简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等

    需求1:订单号要求唯一.长度不太长.自增.但不能通过早上订单号和晚上订单号相减推算出平台大概一天的单量 需求2:要求生成10w张优惠券,要求券码唯一.不能太长,不能轻易猜测出其他券码 根据这些需求提供 ...

随机推荐

  1. perfview微软开源的cpu以及内存性能分析工具

    perfview 是一个强大的分析工具,能用来分cpu,内存,磁盘io...多种指标,使用简单,功能强大 用来分析windows应用的性能问题,是一个很不错的选择 下载地址 https://githu ...

  2. Linux学习笔记-第2天- 新的开始

    迟到且稀疏的笔记,希望自己今年会有所突破.加油

  3. ifream

    很早前看到一个说法,前端要尽量少用ifream,因为它让页面调试麻烦,互操作不方便,会增加http请求,重复加载资源导致内存增加,产生多个页面不好管理等等. 所以很多标准的设计中都推荐不要用ifrea ...

  4. Educational Codeforces Round 59 (Rated for Div. 2) E 区间dp + 状态定义 + dp预处理(分步dp)

    https://codeforces.com/contest/1107/problem/E 题意 给出01字符串s(n<=100),相邻且相同的字符可以同时消去,一次性消去i个字符的分数是\(a ...

  5. 关于一些规范:main()函数的返回值 mingw和mingw-w64编译器的区别

    深度剖析c语言main函数---main函数的返回值 - 编程随笔与杂谈 - CSDN博客 https://blog.csdn.net/z_ryan/article/details/80979008 ...

  6. STM32调试,发现HAL_Init();之后无法调试,甚至无法让程序停下来

    症状 最近开始学习STM32Cube,发现新建工程后无法正常调试,过了HAL_Init();之后就无法继续调试了. 无法进行让程序暂停以及停止等操作.并在输出窗口不断刷出 ERROR: Can not ...

  7. kubernetes实战(九):k8s集群动态存储管理GlusterFS及使用Heketi扩容GlusterFS集群

    1.准备工作 所有节点安装GFS客户端 yum install glusterfs glusterfs-fuse -y 如果不是所有节点要部署GFS管理服务,就在需要部署的节点上打上标签 [root@ ...

  8. freemarker中8个常用的指令

    这里列举出Freemarker模板文件中8个常用的指令. 1. assign assign指令用于创建或替换一个顶层变量,assign指令的用法有多种,包括创建或替换一个顶层变量,创建或替换多个变量等 ...

  9. 【CTS2019】珍珠(生成函数)

    [CTS2019]珍珠(生成函数) 题面 LOJ 洛谷 题解 lun题可海星. 首先一个大暴力\(sb\)的\(dp\)是设\(f[i][S]\)表示当前考虑完了前\(i\)个珍珠,\(S\)集合中这 ...

  10. jquery动画控制非css属性

    JQuery的animate()方法可以通过渐变的更改CSS属性来实现简单的动画效果, 比如 $("#box").animate({height:"300px" ...