交叉编译用于生成aarch64指令的GCC (9.2)

参考

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 file

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.0/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.0 (GCC) 

编写一个hello_world.c:

$ cat hello_world.c
#include <stdio.h>

int main(int argc, const char *argv[])
{
        printf("Hello World\n");
        return 0;
}

编译测试:

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

完。

原文地址:https://www.cnblogs.com/pengdonglin137/p/11565115.html

时间: 2024-07-29 16:25:39

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

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

将两张表的情况全部列举出来 结果表: 列= 原表列数相加 行= 原表行数相乘 CROSS JOIN连接用于生成两张表的笛卡尔集. 在sql中cross join的使用: 1.返回的记录数为两个表的记录数乘积. 2.将A表的所有行分别与B表的所有行进行连接. 例如: tableA r1 r2 A B C D tableB r3 r4 1 2 3 4 select * from tableA cross join tableB; return: r1 r2 r3 r4 r1 r2 1 2 r1 r2

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

利用MyEclipse的引导,能够非常方便的创建简单的.用于生成可运行jar文件的Maven项目: (原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/clementad/article/details/46954277) 1.New -> Project... 选择 Maven Project, 点击Next > 2.在Select projrect name and location界面,各选项例如以下图,点击Next > 3.在Selec

C#实现用于生成条形码的类

本文实例讲述了C#实现用于生成条形码的类.分享给大家供大家参考.具体如下: 这个C#类可以用来生成39码 12位标准条形码 using System.Collections; using System.Text.RegularExpressions; namespace DotNet.Utilities { public class BarCodeToHTML { public static string get39(string s, int width, int height) { Hash

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

1. cv2.equalizeHist(img)  # 表示进行直方图均衡化 参数说明:img表示输入的图片 2.cv2.createCLAHA(clipLimit=8.0, titleGridSize=(8, 8))  用于生成自适应均衡化图像 参数说明:clipLimit颜色对比度的阈值, titleGridSize进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作 直方图均衡化:一般可以用来提升图片的亮度, 在上面一节中,我们可以看出在150-200之间所占的频数特别的大,频数

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

啃过Excel函数的表哥表姐们,一定对函数的嵌套.数组公式等高级的应用有很深的体会,威力是大,但也烧死不少脑细胞,不少人就在这样的绕函数中光荣地牺牲了,走向从入门到放弃.Excel催化剂的创立,初衷就是为了让普通用户,借助类似化学催化剂的作用,让平常难以有反应的常规使用,能够瞬间被点燃,借力完成过去很难完成的事情.此篇给大家介绍一些过往用函数潜逃较为复杂完成的事情,如今仅通过简单的一个自定义函数即可完成. 文章出处说明 原文在简书上发表,再同步到Excel催化剂微信公众号或其他平台上,文章后续有

使用-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 date or doesn't exist. Currently the makefile looks like this: program_NAME := wget++ program_H_SRCS := $(wildcard *.h) program_CXX_SRCS := $(wildcard

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

需求1:订单号要求唯一.长度不太长.自增.但不能通过早上订单号和晚上订单号相减推算出平台大概一天的单量 需求2:要求生成10w张优惠券,要求券码唯一.不能太长,不能轻易猜测出其他券码 根据这些需求提供一个简单的数据库发号的sql来满足上面的需求,介绍如下 Increments表设计两个字段,Prefix和MaxNum,不需要设计主键和聚集索引,在Prefix上建立唯一索引,可Include[MaxNum]字段,这样查询时可以保证索引覆盖 将前缀和数据拼接的服务由应用来提供,数据库自负责拿到增加后

动软代码生成器 可用于生成Entity层,可更改模板 /codesmith 也可以

动软代码生成器官方下载地址:http://www.maticsoft.com/download.aspx 教程:http://jingyan.baidu.com/article/219f4bf7dfda86de442d380b.html codesmith  用法实例:http://www.cnblogs.com/huangcong/archive/2010/06/14/1758201.html

btFormbuilder.js 一个基于bootstrap的jquery插件,用于生成form表单

废话不多,用法和bootstraptable差不多 可以看git项目里面的代码看用法 git项目地址: https://github.com/lurktion/btFormbuilder