参考

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. 微信小程序警告:Now you can provide attr "wx:key" for a "wx:for" to improve performance.

    那是因为在<block wx:for-items="{{imgUrls}}">中不存在wx:key="imgUrls"所以才导致报了个警告. 写成& ...

  2. [LeetCode] 924. Minimize Malware Spread 最大程度上减少恶意软件的传播

    In a network of nodes, each node i is directly connected to another node j if and only if graph[i][j ...

  3. [LeetCode] 367. Valid Perfect Square 检验完全平方数

    Given a positive integer num, write a function which returns True if num is a perfect square else Fa ...

  4. 递归函数详解——VS调试教你理解透彻递归

    #include <stdio.h> #include <stdlib.h> int recursion(int); ; int main(void) { recursion( ...

  5. SpringBoot第十四篇:统一异常处理

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10984081.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   本文将谈论 ...

  6. eclipse web 新建servers时选中tomcat版本后不能继续操作,next是灰色.

    解决方案: 1.退出 eclipse2.到[工程目录下]/.metadata/.plugins/org.eclipse.core.runtime3.把org.eclipse.wst.server.co ...

  7. c#的IDisposable

    尽量在using中使用非托管资源 1.实现Dispose方法 2.提取一个受保护的Dispose虚方法,在该方法中实现具体的释放资源的逻辑 3.添加析构函数 4.添加一个私有的bool类型的字段,作为 ...

  8. Redis学习之对象系统源码分析

    背景知识: Redis并没有直接使用sds,双端链表,字典,压缩列表,跳表等这些数据结构来直接实现键值对数据库,而是基于这些对象创建了一个对象系统,这个对象系统包含5个对象:字符串对象,列表对象,哈希 ...

  9. Apache Commons 简介

    Apache Commons 由多个独立发布的软件包组成,此页面提供了当前可用的 Commons 组件的概述. Components BCEL 字节码工程库 - 分析,创建和操作 Java 类文件. ...

  10. [转帖]PG的时间函数使用整理如下

    PG的时间函数使用整理如下 https://blog.csdn.net/dahuzix/article/details/48576945 1.获取系统时间函数 -- :: -- :: -- :: 2. ...