新闻详情

新闻详情

首页 / 资讯中心 / 详情

如何编一个gcc的交叉工具链

发布时间:2026/10/2 8:28:05来源:尧图网络
如何编一个gcc的交叉工具链
导论自定义编译 GCC 交叉工具链如使用 Crosstool-NG、Buildroot 或手动从源码构建相比直接使用发行版预编译包如 Ubuntu 源中的 gcc-arm-linux-gnueabihf核心优势在于对底层运行环境与硬件特性的绝对控制权。精确匹配目标系统的 C 运行时库硬件架构与指令集的深度优化定制组件版本与最新特性裁剪体积与消除非必要依赖统一的调试与内核接口支持。GCC 是“编译器的编译器框架”平时开发中执行的 gcc 命令只是一个预先编译好的成品Driver。而 GCC 源码本身是一个高度模块化的系统套件。本指南将演示如何构建一个交叉编译器即一种能在当前机器上运行、但为另一种目标机器生成程序的编译器。你所需要的仅仅是一个已预装较新版本 GCC 的Linux环境。编译环境使用ubuntu22.08 x86_64 GNU/Linux开发环境 需要安装组件:sudo apt-get install g make gawk准备编译的gcc 7.3.0(2018 年 1 月 25 日 正式发布) 的老版本适配版本适配内核kernel 5.10.1需要准备如下的组件代码:binutils-2.32.tar.bz2 cloog-0.18.0.tar.gz gcc-7.3.0.tar.xz glibc-2.33.tar.xz gmp-6.1.2.tar.xz isl-0.18.tar.bz2 linux-5.10.1.tar.xz mpc-1.0.3.tar.gz mpfr-3.1.4.tar.xz构建左侧的工具链随后使用这些工具来编译右侧的程序和运行库。实际上并不会去编译目标系统的 Linux 内核但为了编译目标系统的标准 C 库确实需要目标系统的内核头文件Kernel Headers。左侧的编译器在工作时会调用汇编器Assembler和链接器Linker。而下载的其他所有依赖包如 MPFR、GMP 和 MPC都会被链接到编译器本身之中。右侧的架构图展示了一个在目标操作系统上运行的示例程序 a.out它是由交叉编译器编译生成并链接了目标系统的标准 C 库与 C 库。标准 C 库会调用标准 C 库而 C 库则直接向 AArch64 Linux 内核发起系统调用System Calls。操作步骤解压所有的压缩文件包:forfin*.tar*;dotarxf$f;donecdgcc-7.3.0ln-s../mpfr-3.1.4 mpfrln-s../gmp-6.1.2 gmpln-s../mpc-1.0.3 mpcln-s../isl-0.18 islln-s../cloog-0.18.0cd..如果有需要编译其它gcc版本在这个下载:gcc版本下载路径选择一个系统的一个安装目标路径确认有足够的写入权限比如我的:sudomkdir-p/opt/usr/gcc_crosssudochownyz:yz /opt/usr/gcc_crossexportPATH/opt/usr/gcc_cross/bin:$PATH编译BinutilsGNU BinutilsBinary Utilities 是 GNU 工具链中专门用于处理二进制目标文件、汇编代码、静态/动态库以及可执行程序的工具集。在编译流程中GCC 负责将高级语言C/C翻译为汇编语言而后续的汇编、链接、符号管理及二进制分析工作均由 Binutils 完成。mkdirbuild-binutilscdbuild-binutils/../binutils-2.32/configure--prefix/opt/usr/gcc_cross--targetaarch64-linux --disable-multilibmake-j24makeinstallcd..编译linux kernel 头文件cdlinux-5.10.1/makeARCHarm64INSTALL_HDR_PATH/opt/usr/gcc_cross/aarch64-linux headers_installcd..编译c/c编译器mkdir-pbuild-gcc../gcc-7.3.0/configure--prefix/opt/usr/gcc_cross\--targetaarch64-linux\--enable-languagesc,c\--disable-multilib\--disable-nls\--disable-libstdcxx-dual-abimake-j24all-gccmakeinstall-gcc–disable-libstdcxx-dual-abi:强制禁用 GCC 5.1 引入的“C11 双重 ABIDual ABI”机制–disable-nls:GCC 的所有诊断信息、报错和警告将强制统一使用原生英文输出安装 Glibc 头文件和启动文件mkdir-pbuild-glibccdbuild-glibc../glibc-2.33/configure--prefix/opt/usr/gcc_cross/aarch64-linux\--build$MACHTYPE--hostaarch64-linux--targetaarch64-linux\--with-headers/opt/usr/gcc_cross/aarch64-linux/include\--disable-multiliblibc_cv_forced_unwindyesmakeinstall-bootstrap-headersyes install-headersmake-j24csu/subdir_libinstallcsu/crt1.o csu/crti.o csu/crtn.o /opt/usr/gcc_cross/aarch64-linux/lib aarch64-linux-gcc-nostdlib-nostartfiles-shared-xc /dev/null-o/opt/usr/gcc_cross/aarch64-linux/lib/libc.sotouch/opt/usr/gcc_cross/aarch64-linux/include/gnu/stubs.hcd..编译gcc的库cdbuil-gccmake-j24all-target-libgccmakeinstall-target-libgcccd..编译C库cdbuild-glibcmake-j24makeinstall编译gcccdbuild-gccmake-j24makeinstallcd..编译中遇到的报错问题最后的编译中会遇到如下的报错:修改libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc,第 157 行左右将 #include sys/ustat.h 注释掉第 250 行左右将 struct_ustat_sz 的定义注释掉修改libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.h,第192行注释 extern unsigned struct_ustat_sz;修改sanitizer_common_syscalls.inc文件去掉如下代码:#if!SANITIZER_ANDROIDPRE_SYSCALL(ustat)(longdev,void*ubuf){}POST_SYSCALL(ustat)(longres,longdev,void*ubuf){if(res0){if(ubuf)POST_WRITE(ubuf,struct_ustat_sz);}}#endif// !SANITIZER_ANDROIDustat 是一个已被彻底废弃的远古系统调用ustat() 是早期 Unix/Linux 用来查询文件系统空闲块数和 inode 数量的接口。早在数十年前Linux 就已经全面推荐使用标准的 statvfs() 和 statfs() 来取代它。Glibc 在 2.28 版本彻底删除了 sys/ustat.h意味着在 Glibc 2.34 环境下编译的应用不可能、也无法调用 ustat()。ASan以及背后的 compiler-rt会拦截Intercept系统中的数百个标准库函数。ASan 之前包含 ustat唯一的目的只是在极少数老旧程序调用 ustat(dev, ubuf) 时顺便检查一下传入的 ubuf 结构体内存指针是否越界。交叉编译测试查看编译的gcc版本信息:aarch64-linux-g-vUsing built-in specs.COLLECT_GCCaarch64-linux-gCOLLECT_LTO_WRAPPER/opt/usr/gcc_cross/libexec/gcc/aarch64-linux/7.3.0/lto-wrapper Target: aarch64-linux Configured with:../gcc-7.3.0/configure--prefix/opt/usr/gcc_cross--targetaarch64-linux --enable-languagesc,c --disable-multilib --disable-nls --disable-libstdcxx-dual-abi Thread model: posix gcc version7.3.0(GCC)参考对于上面的操作可以参考如下脚本执行快速的自动化配置流程
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

OpenCV指纹识别实战:预处理、特征提取与匹配全链路 2026/10/2 9:17:48

OpenCV指纹识别实战:预处理、特征提取与匹配全链路

简介:这是一套面向计算机、信息安全等专业师生及技术人员的指纹识别实践项目,采用Python结合OpenCV构建完整识别流程,可作为毕业设计参考或图像处理进阶练手素材。资源包共19个文件,约383KB,以11个py源码文件为核心&am…

阅读更多 →
内网横向移动实战详解:从底层逻辑到域渗透核心手法 2026/10/2 9:17:42

内网横向移动实战详解:从底层逻辑到域渗透核心手法

干了这么多年内网渗透和攻防演练,我对横向移动这三个字可以说是又爱又恨。爱它,是因为真正把横向移动玩明白了,你对内网的整体掌控力会上一个大的台阶;恨它,是因为带团队做红队评估时,最怕的就是成员只记住…

阅读更多 →
家政预约系统二次开发实战:订单状态机与佣金结算核心设计 2026/10/2 9:17:42

家政预约系统二次开发实战:订单状态机与佣金结算核心设计

简介:likeshop上门家政系统开源版源码是一套基于likeadmin-php框架开发的上门预约系统,面向需要搭建家政服务平台的开发者与本地生活运营商。系统将用户端与师傅端深度融合,覆盖地图定位、在线预约、自动派单、后台派单、下单支付、核销订单等…

阅读更多 →
Redis 8 原生向量数据库实战:百万级 RAG 应用架构收敛与性能调优 2026/10/2 9:17:42

Redis 8 原生向量数据库实战:百万级 RAG 应用架构收敛与性能调优

1. Redis 接入 AI 这件事,到底在说什么Redis 官方在 2024 年正式发布了 Redis 8,其中最引人注目的变化就是原生集成了向量数据库能力,并且推出了 Redis Query Engine 和 Redis Insight 的 AI 辅助功能。简单说,Redis 不再只是一个…

阅读更多 →
从青少年开源论坛到第一次PR:新手参与开源项目的完整路径 2026/10/2 9:17:42

从青少年开源论坛到第一次PR:新手参与开源项目的完整路径

1. COSCon与青少年开源:这个论坛到底在讲什么 COSCon全称China Open Source Conference,圈子里都叫它“中国开源年会”。这些年每年都参加,现场氛围一直很热闹,但说实话,早几年的议题基本围绕企业级开源、基础设施、云…

阅读更多 →
U-Boot ping不通PC或虚拟机:四层链路与PHY/RGMII排查 2026/10/2 9:17:35

U-Boot ping不通PC或虚拟机:四层链路与PHY/RGMII排查

U-Boot 里敲下ping 192.168.1.10,终端停了几秒,然后甩出一行ping failed; host 192.168.1.10 is not alive。没有中间状态,没有提示,没有分层信息,就一句不通。这个场景几乎每个做 Uboot 网络移植的人都撞过&#xff1…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉