linux 上编译arm64,Arch Linux 搭建 arm64/AArch64 交叉编译环境
Arch Linux 搭建 arm64/AArch64 交叉编译环境
0. 系统环境
系统:
Arch Linux: 成文时间最新
工具版本:Binutils:2.34-1
GCC:9.2.1+20200130-2
GNUMake:4.3
1. 编译交叉编译工具链
此部分参考博客.
交叉编译工具链需要用到至少七个工具(库):Binutilshttps://www.gnu.org/software/binutils/
GCC https://gcc.gnu.org/
glibc https://www.gnu.org/software/libc/
LinuxKernelhttps://www.kernel.org/
MPFR https://www.mpfr.org/
GMP https://gmplib.org/
MPC http://www.multiprecision.org/mpc
同时我们还有两个用于优化的库:http://isl.gforge.inria.fr/
CLooGhttps://github.com/periscop/cloog
这两个库是可选的.
搭建完成后我们会获得一系列编译, 链接工具, 包括我们熟知的 gcc,ld 等.
1.1 准备工作
首先建立三个目录, 分别存放源码, 构建文件和编译结果(也即我们需要的交叉编译工具链)mkdir-p/path/to/cross-compile-src/
mkdir-p/path/to/cross-compile-build/
mkdir-p/path/to/cross-compile-install/
exportCROSS_COMPILE_SRC=/path/to/cross-compile-src/
exportCROSS_COMPILE_BUILD=/path/to/cross-compile-build/
exportCROSS_COMPILE_INSTALL=/path/to/cross-compile-install/
将安装目录内未来会生成的 bin 目录加入 PATH(我以为这一步只是为了省事, 为了不把环境变量搞乱我第一次尝试没有加, 结果编译失败)
export PATH=$CROSS_COMPILE_INSTALL/bin:$PATH
接下来下载相应的包, 笔者选用的软件包版本分别为(除 Linux Kernel 外均为成文时最新稳定)软件名版本Binutils2.34
GCC9.2.0
glibc2.31
Linux Kernel4.14.172
MPFR4.0.2
GMP6.2.0
MPC1.1.0
isl0.18
CLooG0.18.1
下载相应的包cd $CROSS_COMPILE_SRC
exportGNU_MIRROR_SITE=https://mirrors.tuna.tsinghua.edu.cn/gnu/
exportKERNEL_MIRROR_SITE=https://mirrors.tuna.tsinghua.edu.cn/kernel/
wget $GNU_MIRROR_SITE/binutils/binutils-2.34.tar.xz# binutils
wget $GNU_MIRROR_SITE/gcc/gcc-9.2.0/gcc-9.2.0.tar.xz# gcc
wget $GNU_MIRROR_SITE/glibc/glibc-2.31.tar.xz# glibc
wget $KERNEL_MIRROR_SITE/v4.x/Linux-4.14.172.tar.xz# kernel
wget $GNU_MIRROR_SITE/mpfr/mpfr-4.0.2.tar.xz# mpfr
wget $GNU_MIRROR_SITE/gmp/gmp-6.2.0.tar.xz# gmp
wget $GNU_MIRROR_SITE/mpc/mpc-1.1.0.tar.gz# mpc
# optional
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 # isl
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz # cloog
解压forfin*.tar.xz;dotar-xJf $f;done
forfin*.tar.bz2;dotar-xjf $f;done
forfin*.tar.gz;dotar-xzf $f;done
建立 GCC 依赖库们的软链接ln-s../mfpr-4.0.2gcc-9.2.0/mfpr# mfpr
ln-s../gmp-6.2.0gcc-9.2.0/gmp# gmp
ln-s../mpc-1.1.0gcc-9.2.0/mpc# mpc
# optional
ln-s../isl-0.18gcc-9.2.0/isl# isl
ln-s../cloog-0.18.1gcc-9.2.0/cloog# cloog
设定编译时使用的线程数
export NPROC=`nproc` # use all processors
1.2. 编译安装 Binutils
这个工具包将会被安装在 /path/to/cross-compile-gcc/install/bin 内, 包括了交叉汇编器, 交叉链接器等工具.cd $CROSS_COMPILE_BUILD
mkdir binutils
cd binutils
$CROSS_COMPILE_SRC/binutils-2.34/configure--prefix=$CROSS_COMPILE_INSTALL--target=aarch64-Linux--disable-multilib
make-j$NPROC
make install
1.3. 安装 Linux Kernel 头文件
这一步会将 Linux Kernel 头文件安装咋 $CROSS_COMPILE_INSTALL/aarch64-install/include, 这样交叉编译链编译出的软件可以在目标平台中使用 Linux 系统调用.cd $CROSS_COMPILE_SRC/Linux-4.14.172
make ARCH=arm64 INSTALL_HDR_PATH=$CROSS_COMPILE_INSTALL/aarch64-Linuxheaders_install
1.4. 编译安装 GCC 和 glibc
这是很长的一步, 我们将要轮流编译属于两个库 (GCC 和 glibc) 的组件, 并最终全部编译完成. 编译顺序如下(图源为参考博客)
1.4.1. 编译器
这一步只会安装 C/C++ 交叉编译器本身, 它们会被安装在 $CROSS_COMPILE_INSTALL/bin.cd $CROSS_COMPILE_BUILD
mkdir gcc
cd gcc
$CROSS_COMPILE_SRC/gcc-9.2.0/configure--prefix=$CROSS_COMPILE_INSTALL--target=aarch64-Linux--enable-language=c,c++--disable-multilib
make-j$NPROC all-gcc
make install-gcc
这一步要编译个十分钟左右, 可以去喝口水, 打个飞机什么的.
1.4.2. 标准 C 头文件和启动文件
这一步里我们将所有的标准 C 头文件安装在 $CROSS_COMPILE_INSTALL/aarch64-Linux/include 内. 同时我们还会编译一些启动文件并安装在 $CROSS_COMPILE_INSTALL/aarch64-Linux/lib 内, 这些文件将被下一步用到, 并在下下步被替换.
注意: 如果前面没有把 $CROSS_COMPILE_INSTALL/bin 加入到 PATH 中的话这一步会报错.cd $CROSS_COMPILE_BUILD
mkdir glibc
cd glibc
$CROSS_COMPILE_SRC/glibc-2.31/configure--prefix=$CROSS_COMPILE_INSTALL/aarch64-Linux--build=$MACHTYPE--host=aarch64-Linux--target=aarch64-Linux--with-headers=$CROSS_COMPILE_INSTALL/aarch64-Linux/include--disable-multilib libc_cv_forced_unwind=yes
make install-Bootstrap-headers=yes install-headers
make-j$NPROC csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o $CROSS_COMPILE_INSTALL/aarch64-Linux/lib
aarch64-Linux-gcc-nostdlib-nostartfiles-shared-x c/dev/null-o $CROSS_COMPILE_INSTALL/aarch64-Linux/lib/libc.so
touch $CROSS_COMPILE_INSTALL/aarch64-Linux/include/gnu/stubs.h
1.4.3. 编译器支持库
这一步我们使用前面编译得到的交叉编译器来编译编译器支持库.cd $CROSS_COMPILE_BUILD/gcc
make-j$NPORC all-target-libgcc
make install-target-libgcc
1.4.4. 编译标准 C 库
这一步我们可以完成 glibc 的编译安装. 标准 C 库将被安装于 $CROSS_COMPILE_INSTALL/aarch64_linux/lib.cd $CROSS_COMPILE_BUILD/glibc
make-j$NPROC
make install
这一步依然要十来分钟, 可以再来一发.
1.4.5. 编译标准 C++ 库
这一步我们可以完成 GCC 的编译安装. 标准 C++ 库将被安装于 $CROSS_COMPILE_INSTALL/aarch64_linux/lib64.cd $CROSS_COMPILE_BUILD/gcc
make-j$NPROC
make install
注意: 这一步可能出现如下错误error:'PATH_MAX'wasnotdeclaredinthisscope
216|charfilename[PATH_MAX];
|^~~~~~~~
看了编译命令发现没有将我们导入的 Linux 头文件加入 include 范围, 因此编译时 include 的头文件来自系统的 Linux 头文件. 因为编译 GCC 使用的头文件不一定是 GCC 运行时使用的头文件, 所以这个问题理论上不会影响交叉编译的结果. 我们只需要简单地修改下源码, 将#ifndefPATH_MAX
# define PATH_MAX 4096
#endif// PATH_MAX
加入 $CROSS_COMPILE_SRC/gcc-9.2.0/libsanitizer/asan/asan_linux.cc 即可.(如果有更好的方法请一定告诉我)
1.5. 测试交叉编译器aarch64-Linux-gcc helloworld.c-o a.out
aarch64-Linux-objdump-d a.out
1.6. 吐槽
你问我为什么不用 community 源里的 aarch64-Linux-gnu-*?
因为我瞎我没看到(哭).
2. 交叉编译内核
3. 安装内核
来源: http://www.bubuko.com/infodetail-3460631.html
linux 上编译arm64,Arch Linux 搭建 arm64/AArch64 交叉编译环境相关推荐
- linux编译aborted,Ubuntu Linux上编译kernel出错__stack_chk_fail
Ubuntu Linux上编译kernel出错__stack_chk_fail 发布时间:2008-02-06 00:02:18来源:红联作者:SMuonon init/built-in.o: In ...
- RH系列linux上编译android2.3(gingerbread)
在RH系列linux上编译android2.3(gingerbread)的过程如下: 官方源码及ubuntu编译过程在(http://source.android.com/source/index.h ...
- 在linux上编译错误,Daemontools 在 Linux上编译错误解决
在Linux上编译daemontools出现错误 执行install出现 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .t ...
- linux 保存编译log,(转)Linux下编译安装log4cxx
一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. 第一步安装apr-1.3.8,顺序不能错,它必须首 ...
- arch linux安装_安装Arch Linux如何使我的旧笔记本电脑重获新生
arch linux安装 by Jonathan Baldie 乔纳森·巴尔迪(Jonathan Baldie) 安装Arch Linux如何使我的旧笔记本电脑重获新生 (How installing ...
- linux上安装telnet服务器:linux vmvare虚拟机 安装telnet redhat9
linux上安装telnet服务器:linux vmvare虚拟机 安装telnet redhat9 参考:http://blog.sina.com.cn/s/blog_5688414b0100bhr ...
- linux编译时开启宏,【spec】Linux上编译安装的spec文件中的常用路径以及宏变量
我们在Linux上利用 rpmbuild 构建 rpm 安装包时,通过命令rpm --showrc 查看实现代码,另外直接通过 rpm --eval "%{macro}"来查看具体 ...
- printf如何消后续0_Hello World背后的故事:如何在Linux上编译C语言程序
欢迎访问我的网站查看原文: https://lulaoshi.info/blog/2020/05/31/compile-c-hello-world-on-linux.htmllulaoshi.inf ...
- 红帽 linux 安装gns3,在Arch Linux和Manjaro系统上安装GNS3的方法
本文介绍在Arch Linux和Manjaro系统上安装GNS3的方法,适合所有基于Arch Linux的发行版.我们还将为Gns3创建一个启动器,适用于KDE.Gnome 3和Linux上其它桌面环 ...
最新文章
- PHP基础知识(三)
- JavaScript格式化数字显示格式
- 资料分享 | 数据挖掘实例资料分享来袭
- python安装opencv出现错误_Python3安装OpenCV出错,如何解决?
- 字节流读数据 一次读一个字节
- 微课|中学生可以这样学Python(例5.10):字符串编码与加密
- 人生第一个深入理解的DFS题 HDU 1016
- Kafka Streams简介: 让流处理变得更简单
- 解决windows下使用pycharm的anaconda安装numpy或tensorflow不成功的问题
- 使用Art Text如何在Mac上创建水彩画?
- Gradle下载类库源码
- set+线段树 Codeforces Round #305 (Div. 2) D. Mike and Feet
- 将Chrome浏览器默认保存离线网页为“多个文件”设置为“单个文件”即单个mhtml文件
- 基于comsol软件的三维单模光纤模拟
- ccy测试影响因子版270ms
- x264命令参数与代码中变量的对应关系
- CALPHAD方法中“外推”的理解
- 微信号名称乱码什么情况_微信号改成什么好?
- 基于matlab GUI Powell+蚁群算法图像配准
- 从图表中的断线简聊DAX中的空值(null)
热门文章
- 【jmeter测试--自带录制脚本功能】
- 移动web开发清除默认样式设置
- 计算机慢的解决方法,妹子告诉你:电脑慢的原因及快速解决办法
- Comviva的MobiLytix™ IRIS被评为年度最佳“创新型电信解决方案”
- Golang 中使用 JSON 的一些小技巧 陶文 陶文 3 个月前 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:,string 就可以支持了
- 「开源人说」第二期重磅上线!一起走进《从开源中来,到开源中去》
- 雷达图的4种绘制方法,你更喜欢哪个?
- 系统集成项目管理工程师备考资料(口袋应试第二版总结及目录)
- 给windows设置定时任务并运行py脚本
- Autofs或nfs挂载后,目录内无法编辑或创建,权限问题