构建gcc交叉编译工具链

article/2025/9/18 17:49:23

如何构建一个GCC交叉编译工具链

GCC不仅是一个编译器,它是一个开源工程,可以让你建立各种编译器。一些编译器支持多线程,一些支持共享库,一些支持Multilib(典型的应用是在64位机上运行32位应用程序),这些都取决于在编译 编译器 时的配置。

本文档将说明怎么建立一个交叉编译器。你需要一个已经安装gccUnix-like环境。

 

一、需要的包

Debian系统,首先需要安装一些包

$ sudo apt-get install g++ make gawk

其他的包将使用源代码来编译。在根文件系统的某个地方新建一个文件夹,下载下面的包。本文是2014年写的,你看到时,可能有更新的包可以使用,所以你可以使用更新的包。

$ wget http://ftpmirror.gnu.org/binutils/binutils-2.24.tar.gz

$ wget http://ftpmirror.gnu.org/gcc/gcc-4.9.2/gcc-4.9.2.tar.gz

$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.17.2.tar.xz

$ wget http://ftpmirror.gnu.org/glibc/glibc-2.20.tar.xz

$ wget http://ftpmirror.gnu.org/mpfr/mpfr-3.1.2.tar.xz

$ wget http://ftpmirror.gnu.org/gmp/gmp-6.0.0a.tar.xz

$ wget http://ftpmirror.gnu.org/mpc/mpc-1.0.2.tar.gz

$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.12.2.tar.bz2

$ wget ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-0.18.1.tar.gz

最开始的四个包:binutilsgccLinux kernelglibc是主要要用的包。后面三个mpfrgmpmpc你可以使用系统自带的package manager安装,但是可能比较旧。最后两个包ISLCLooG是可选的,它们支持一些优化。

 

二、它们是怎么有机结合在一起的呢?

当我们完成时,我们会构建如下的程序和库。首先,构建左边的工具,然后使用这些工具来构建右边的程序和库。我们将不构建目标系统的Linux kernel,但是我们需要kernel header来构建目标系统标准C库。

左边的编译器将调用汇编器和链接器。其他的包MPFRGMPMPC将连接到编译器中。

右边图中的a.out,运行在目标OS上,使用交叉编译器,连接目标系统标准C库和C++库。C++标准库调用标准C库,C库直接调用Linux kernel

注意,除了使用glibc外,还可以使用其他替代的C库实现,比如Newlibcuclibc等,其他替代的C库用在嵌入式中较多,比glibc库要小,功能没有glibc全面。

 

三、构建步骤

解压所有的包。

$ for f in *.tar*; do tar xf $f; done

创建一些其他目录的符号连接,这5个包依附于gcc,如果存在符号连接,gcc脚本将自动build这些包。

$ cd gcc-4.9.2

$ ln -s ../mpfr-3.1.2 mpfr

$ ln -s ../gmp-6.0.0 gmp

$ ln -s ../mpc-1.0.2 mpc

$ ln -s ../isl-0.12.2 isl

$ ln -s ../cloog-0.18.1 cloog

$ cd ..

选择一个安装路径,确保有写的权限。下面步骤中,我将安装新的工具链到/opt/cross

$ sudo mkdir -p /opt/cross

$ sudo chown jeff /opt/cross

整个构建过程中,确保安装的bin子目录在你的PATH环境变量中。后续你可以从PATH中移除该目录,但是大部分构建步骤将会默认通过PATH来查找aarch64-linux-gcc和其他host工具。

$ export PATH=/opt/cross/bin:$PATH

注意/opt/cross/aarch64-linux/目录下的文件。该目录被认为是虚拟的aarch64 linux目标系统的根目录。理论上,可以使用里面所有的头文件和库。

 

1. Binutils

构建binutils、安装交叉汇编器、链接器和其他工具的步骤:

$ mkdir build-binutils

$ cd build-binutils

$ ../binutils-2.24/configure --prefix=/opt/cross --target=aarch64-linux --disable-multilib

$ make -j4

$ make install

$ cd ..

我们制定aarch64-linux作为目标系统类型,binutils的配置脚本将识别到它与正在进行编译的主机系统不一样,配置一个交叉汇编器和交叉链接器。这些工具将安装到/opt/cross/bin,名字以arm-linux-开头。

--disable-multilib意味着我们只希望我们的程序和库使用aarch64指令集,而不使用aarch32的指令集。

 

2. Linux Kernel Headers

Linux kernel 头文件安装到/opt/cross/aarch64-linux/include, 使用新工具链构建的程序会调用这些目标环境中的aarch64 kernel

$ cd linux-3.17.2

$ make ARCH=arm64 INSTALL_HDR_PATH=/opt/cross/aarch64-linux headers_install

$ cd ..

我们也可以在构建binutils之前做这件事。

尽管第4步,configure脚本期望linux kernel header依据安装,但是实际上在步骤6之前,当我们编译标准C库时,linux kernel headers不会被用到。

因为Linux kernel和其他开源工程不一样,它有一个不同的方式来识别目标CPU架构: ARCH=arm

剩下的步骤涉及构建GCCGlibc。这里有个道道,就是部分gcc需要部分glibc被构建,而部分glibc又需要gcc被构建。我们不能一步搞定这些编译,而是要分成几步。我们要这几个包之间来往几次。


3. C/C++ Compilers

该步将构建gccCC++编译器,并安装到/opt/cross/bin,目前还不能引用这些编译器来构建库。

$ mkdir -p build-gcc

$ cd build-gcc

$ ../gcc-4.9.2/configure --prefix=/opt/cross --target=aarch64-linux --enable-languages=c,c++ --disable-multilib

$ make -j4 all-gcc

$ make install-gcc

$ cd ..

因为我们指定了--target=aarch64-linux,构建脚本会依据aarch64-linux-前缀查找第一步安装的binutils工具。同样,C/C++编译器的名字也会带上aarch64-linux-前缀。

--enable-languages=c,c++避免了在GCC套件中出现其他的编译器,比如FortranJava等。

 

4. Standard C Library Headers and Startup Files

安装标准C库头文件到/opt/cross/aarch64-linux/include。我们会使用第三步构建的C编译器来编译库的startup files并安装到/opt/cross/aarch64-linux/lib。最后我们创建几个傀儡文件,libc.sostubs.h,在第5步会用到,但是第6步会替换为真的。

$ mkdir -p build-glibc

$ cd build-glibc

$ ../glibc-2.20/configure --prefix=/opt/cross/aarch64-linux --build=$MACHTYPE --host=aarch64-linux --target=aarch64-linux --with-headers=/opt/cross/aarch64-linux/include --disable-multilib libc_cv_forced_unwind=yes

$ make install-bootstrap-headers=yes install-headers

$ make -j4 csu/subdir_lib

$ install csu/crt1.o csu/crti.o csu/crtn.o /opt/cross/aarch64-linux/lib

$ aarch64-linux-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /opt/cross/aarch64-linux/lib/libc.so

$ touch /opt/cross/aarch64-linux/include/gnu/stubs.h

$ cd ..

--prefix=/opt/cross/aarch64-linux告诉configure脚本它要安装头文件和库到这里。注意这个和普通的--prefix

Glibcconfigure需要我们制定所有的--build--host--target系统类型。

$MACHTYPE是一个预定义的环境变量,表示正在运行build脚本的机器。--build=$MACHTYPE是必须的,因为在第六步中,该build脚本将编译一些额外的工具,这些工具是build进程的一部分。

--host,在glibcconfigure中,--host--target选项都指glibc库最终运行的系统。

我们手动安装Cstartup文件,ctr1.o ctri.octrn.o。其他的方法好像都有副作用。

 

5. Compiler Support Library

使用第三步的交叉编译器构建compiler support library,编译器支持的库包含一些C++异常处理样板代码等等。该库依赖第四步安装的startup file。第六步需要该库。不像其他的指导手册,我们不需要重新运行gcc configure。只需要在相同配置下构建额外的target即可。

$ cd build-gcc

$ make -j4 all-target-libgcc

$ make install-target-libgcc

$ cd ..

两个静态库,libgcc.alibgcc_eh.a,安装到/opt/cross/lib/gcc/aarch64-linux/4.9.2.

共享库,lingcc_s.so,安装到/opt/cross/aarch64-linux/lib64.

 

6. Standard C Library

这步完成glibc的安装。安装标准C库到/opt/cross/aarch64-linux/lib中。静态库名字为libc.a,动态库为libc.so

$ cd build-glibc

$ make -j4

$ make install

$ cd ..

 

7. Standard C++ Library

最后完成gcc的安装,构建标准C++库,安装到/opt/cross/aarch64-linux/lib64。它依赖第六步的C库。目标静态库名字为libstdc++.a,动态库为libstdc++.so

$ cd build-gcc

$ make -j4

$ make install

$ cd ..

 

 

How to Build a GCC Cross-Compiler

http://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/IRej3jat.shtml

相关文章

ARM交叉编译工具链分类说明

为什么要用交叉编译器? 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不…

ARM-Linux 交叉编译工具链安装

创建时间:2022-04-12-23:10 说明:在Linux下安装arm-linux交叉编译工具链 修改时间: 修改内容: 1. 前言 在ubuntu中系统自带的gcc编译器是基于x86架构的,通过该编译器编译出来的代码只能在x86架构上运行。 如果需要在x…

【linux】安装Linux的交叉编译工具链

1、linux中装软件的特点 linux中安装软件比windows中复杂。linux中安装软件一般有以下几种方法: 第一种:在线安装。譬如ubuntu中使用apt-get install vim来安装vim软件。 第二种:自己下载安装包来安装。这种方式的缺陷就是你不知道你…

制作交叉编译工具链

制作交叉编译工具链 编写可以在ARM上运行的程序需要使用arm-linux-gcc交叉编译工具。因此,需要制作一套交叉编译器工具链,使用它,可以让代码运行在ARM平台上。 制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG&#xff…

【交叉编译】配置交叉编译工具链

配置交叉编译工具链 一、 设置交叉编译工具链1.永久生效2.临时生效3.手动指定 二、测试交叉编译工具链1.测试环境变量:2.测试交叉编译器: 一、 设置交叉编译工具链 交叉编译工具链用来在Ubuntu主机上编译应用程序,而这些应用程序是在ARM等其…

【编译原理】交叉工具链详解

1、嵌入式开发模型-交叉开发 在嵌入式开发过程中有宿主机和目标机的角色之分,宿主机是执行编译、链接嵌入式软件的计算机,目标机是运行嵌入式软件的硬件平台。在宿主机执行编译的流程如下: 而所谓的交叉编译就是:在一种平台上编…

linux交叉编译工具链安装

交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。   交叉编译器有很多种,我们使用 Linaro 出品的交叉编译器,Linaro 一间非营利性质的开放源代码软件工程公司,Linaro 开发了很…

常用的交叉编译工具链

交叉编译工具链是一种用于在一个平台上编译另一个平台上运行的程序的软件工具集,它通常包括编译器、链接器、汇编器等组件。 交叉编译工具链的命名一般遵循 target-platform-triplet 的格式,例如 arm-linux-gcc 表示用于生成 ARM 平台上 Linux 系统下运…

基于cmake的交叉编译工具链

基于cmake的交叉编译工具链 本文转载自:https://segmentfault.com/a/1190000019276315,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。 一、基本概念 1. 什么是交叉编译 交叉编译是A机器上编译生成,运行在B机…

交叉编译工具链建立与常识

交叉编译工具链的命名规则 arch [-vendor] [-os] [-(gnu)eabi] arch – 体系架构,如ARM,MIPS,对于MIPS可能还分大端模式mips或者小端模式mipsel; vendor – 工具链提供商,可能有的工具链会省去这个字段,…

交叉编译工具链的安装和配置过程

1. 编译工具链基本介绍 C/C程序需要编译成二进制的机器码才能被CPU识别运行,而编译程序就需要用到编译器,比如我们常用的gcc编译器。 gcc编译器,其实只是编译工具链的其中一个工具而已,实际上整个编译工具链包含了:g…

编译工具链和交叉编译工具链简易说明

文章目录 编译工具链交叉编译工具链 编译工具链 做C/C开发特别是嵌入式方向的肯定会涉及编译工具链和交叉编译工具链相关内容。 C/C的程序需要经过 gcc 等编译成二进制程序才能被计算机使用,这里的 gcc 通常是泛指,包括 gcc 、 g 、ar 、as 、ld 等一系…

Linux vim分屏,如何切换窗口

1.使用 :vsp 2.若想切换窗口,从左边切换到右边,crtlw 点击两次

alt tab无法切换窗口

alt tab无法切换窗口 1. 在桌面新建 a.txt 文件 2. 在文件中输入下面内容 REGEDIT4 [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer] "AltTabSettings"dword:000000013. 将文件改为 a.reg 4. 双击文件, 点击所有确定/是 5.重启电脑

Win7系统怎么改变Alt+Tab切换窗口数量,改变Alt+Tab切换窗口数量的方法

我们在使用Win7电脑办公的时候,常常会需要用到切换窗口的快捷键AltTab,这样可以快速切换不同的程序界面,提高工作效率,但是AltTab切换窗口的数量是固定的,不过我们可以改变这个数量,下面小编给大家介绍Win7…

win10系统使用快捷键无法切换窗口怎么办

但是最近,有win1064位系统用户在使用快捷键切换窗口时发现切换不了,那么碰到win10系统使用快捷键无法切换窗口怎么办呢?今天就为大家介绍win10系统使用快捷键无法切换窗口的解决方法。 快捷键无法切换窗口 1、点击开始菜单,选择运行&#…

Linux中如何上下左右切换窗口

linux中如何上下左右切换窗口 ##第一步 将图中show miniature view勾选中,此时窗口会变成最小显示窗口,此时窗口就可以通过ctrlAlt方向键,进行上下左右切换。 ##第二步 将第一步勾选的show miniature view去掉,此时窗口变得正常&a…

win10 edge切换窗口,取消edge窗口为多个,改为独立窗口

win10系统 edge切屏问题 问题情况 edge切屏的时候会显示edge其他的窗口界面,而不是所有的edge十一个窗口的显示情况 解决方法 第一步 找到设置 第二步 搜索多窗口 点击第一个多任务设置 第三步,找到alttab选项 如下图所示 第四步&#x…

点任务栏不切换窗口_如何使您的任务栏按钮始终切换到最后一个活动窗口

点任务栏不切换窗口 Since Windows 7, apps with multiple open windows are combined into a single taskbar button. Hovering over the button gives you a live thumbnail of every window and you can then click the window you want to work with. 从Windows 7开始,具有…

打开计算机窗口的快捷键是什么,快速切换窗口的快捷键是什么

快速切换窗口的快捷键是什么 使用快捷键能让我们更加快捷地操作电脑,那么快速切换窗口的快捷键是什么呢?下面小编带着大家一起来了解一下吧! 快速切换窗口的快捷键 方法一、AltTab快捷键切换窗口 在使用AltTab快捷键切换窗口时,在…