手把手搭建arm/mips交叉编译环境

一、什么是交叉编译

对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用?
在解释什么是交叉编译之前,先要明白什么是本地编译。

本地编译
本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译:
比如,我们在 x86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 x86 平台上的工具,开发针对 x86 平台本身的可执行程序,这个编译过程称为本地编译。

交叉编译
交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:
比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

二、为什么会有交叉编译

之所以要有交叉编译,主要原因是:

  • Speed:目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能
  • Capability:整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间
  • Availability:即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得
  • Flexibility:一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上

三、什么是交叉编译工具链

一般所说的工具链,指的是本地平台自己的工具链。而用于交叉编译的工具链,就是交叉工具链。交叉工具链中,gcc编译器、ld链接器以及其他的相关工具,都是用来跨平台交叉编译的。

交叉工具链与本地工具链类似,也有交叉编译版本的gcc, ld, as等工具,与本地工具链两两对应。交叉工具链中最重要的工具还是编译器gcc,所以我们也经常把交叉工具链简称为交叉编译器,即严格意义上来讲,交叉编译器指的是交叉编译版本的gcc,但为了叫法上的方便,我们平常说的交叉编译,其实指的都是交叉工具链。

例如常用的交叉编译器arm-linux-gcc,其实是一系列交叉编译版本的交叉工具链,其中包含了arm-linux-gcc, arm-linux-ld, arm-linux-as等工具。

四、如何部署交叉编译环境

国产UOS

  • 更新一下apt源
$ sudo apt-get update
  • 执行命令安装
$ sudo apt-get install emdebian-archive-keyring 
$ sudo apt-get install linux-libc-dev-mips64el-cross libc6-mips64el-cross
# sudo apt-get install linux-libc-dev-arm64-cross libc6-arm64-cross
$ sudo apt-get install binutils-mips64el-linux-gnuabi64 gcc-8-mips64el-linux-gnuabi64
# sudo apt-get install binutils-aarch64-linux-gnu gcc-8-aarch64-linux-gnu
$ sudo apt-get install g++-8-mips64el-linux-gnuabi64
# sudo apt-get install g++-8-aarch64-linux-gnu

#注释的内容为aarch64 架构的交叉编译链工具

  • 验证:执行命令
$ mips64el-linux-gnuabi64-gcc-8 -dumpmachine
mips64el-linux-gnuabi64

五、编写第一个Hello world

  • 创建c文件
$ vim hello.c
// 程序头文件
#include <stdio.h>
// 主入口函数
int main(int arc, char* argv[])
{
  printf("Hello World!\n");
	return 0;
}
  • 编译第一个程序
$ mips64el-linux-gnuabi64-gcc-8 -o hello hello.c
  • 查看文件类型
$ file hello
hello: ELF 64-bit LSB pie executable, MIPS, MIPS64 rel2 version 1 (SYSV), dynamically linked, interpreter 
/lib64/ld.so.1, BuildID[sha1]=0860832b7cdda9bc95325462a0c79b78ffe3b3f0, for GNU/Linux 3.2.0, not stripped
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
驱动器 D 中的卷是 LINUX 卷的序列号是 4471-561B D:\桌面\mips交叉编译环境 的目录 2009-10-22 20:27 <DIR> . 2009-10-22 20:27 <DIR> .. 2009-10-22 20:09 27,425,338 gcc-3.4.3.tar.bz2 2009-10-22 20:08 7,421,782 binutils-2.10.91.0.2.tar.bz2 2009-10-22 20:08 242,445 glibc-linuxthreads-2.5.tar.bz2 2009-10-22 20:10 20,544,628 glibc-2.5.tar.gz 2009-10-22 20:20 1,720 elf-machine-rela-mips.dpatch 2009-10-22 20:26 4,727 建立基于linuxMIPS交叉编译环境 .txt 6 个文件 55,640,640 字节 2 个目录 6,793,084,928 可用字节 三、构建过程 1、准备环境 目标平台: mipsel-linux(即little endian,x86也是little endian的,不懂的话自己到网上查资料吧) 安装目录: /usr/local/crossdev 源代码安装目录: /usr/local/src 注:没有的目录请自行建立。 2、准备MIPS环境的头文件 我们是在i386下编译的,但要使用MIPS的头文件定义才能正确编译MIPS交叉编译工具。这些头文件都在kernel源程序中。 cd /usr/local/src/ tar xzvf linux-2.4.2.tar.gz cd linux/ make ARCH=mips menuconfig 在"CPU selection"中, 选中"(R3000) CPU type",也可以选你实际的MIPS平台的CPU类型 在"General setup"中, 选中"Generate little endian code" make dep mkdir -p /usr/local/crossdev/mipsel-linux/include cp -r /usr/local/src/linux/include/asm-mips /usr/local/crossdev/mipsel-linux/include/asm cp -r /usr/local/src/linux/include/linux /usr/local/crossdev/mipsel-linux/include/ 3、编译binutils cd /usr/local/src/ tar xzvf binutils-2.11.90.0.31.tar.gz cd binutils-2.11.90.0.31/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev make make install export PATH=/usr/local/crossdev/bin:$PATH 4、编译自举的(bootstrap)gcc 因为这时还没有MIPS的glibc库可以使用,只能编译一个最简单的gcc,用这个gcc编译出glibc后就可以再编译一个完成的gcc了。 cd /usr/local/src/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c --with-newlib --disable-shared make make install 注:以上编译安装的工具已经可以直接编译MIPS的kernel(make zImage)了。 5、编译glibc 现在可以使用刚才建立的binutils和gcc来编译MIPS的glibc了。 cd /usr/local/src/ tar xzvf glibc-2.2.3.tar.gz cd glibc-2.2.3/ tar xzvf ../glibc-linuxthreads-2.2.3.tar.gz patch -p1 < ../glibc-2.2.3-mips-base-addr-got.diff CC=mipsel-linux-gcc AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib ./configure --host=mipsel-linux --prefix=/usr/local/crossdev/mipsel-linux --enable-add-ons=linuxthreads make make install 6、重新编译完整的gcc cd /usr/local/src/ rm -rf gcc-3.0.2/ tar xzvf gcc-3.0.2.tar.gz cd gcc-3.0.2/ ./configure --target=mipsel-linux --prefix=/usr/local/crossdev --enable-languages=c,c++ make make install 以上就构建好了一套自己的MIPS交叉编译环境,目录在/usr/local/crossdev下,你可以把它打包拷贝到其它i386的Linux系统下也能使用。 要使用其来交叉编译时请先加上PATH环境变量:export PATH=/usr/local/crossdev/bin:$PATH
不同的CPU体系结构有不同的特点和应用场景。其中,x86架构是一种性能高、速度快、兼容性好的架构,代表性的厂商有英特尔和AMD。ARM架构则具有低成本和低功耗的特点,代表性的厂商有苹果、谷歌、IBM和华为。MIPS架构则具有简洁、优化方便和高拓展性的特点,代表性的厂商有龙芯MIPS科技公司。而RISC-V架构是一种基于精简指令集计算原理建立的开放指令集架构,具有模块化、极简和可拓展的特点,代表性的厂商有三星、英伟达和西部数据。RISC-V架构的发展相对较晚,但发展速度很快,可以根据具体场景选择适合指令集的指令集架构,适用于服务器CPU、家用电器CPU、工控CPU和小型传感器中的CPU。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [几种芯片架构:X86、ARM、RISC-V和MIPS](https://blog.csdn.net/Jason_Lee155/article/details/117574530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [四大主流芯片架构(X86、ARM、RISC-V和MIPS)](https://blog.csdn.net/maopig/article/details/121324070)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值