交叉编译

本贴最后更新于 568 天前,其中的信息可能已经时移俗易

什么是交叉编译

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

本地编译

本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译:

比如,我们在 x86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 x86 平台上的工具,开发针对 x86 平台本身的可执行程序,这个编译过程称为本地编译。

交叉编译

交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:

比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

在 Windows PC 上,利用 ADS(ARM 开发环境),使用 armcc 编译器,则可编译出针对 ARM CPU 的可执行代码。
在 Linux PC 上,利用 arm-linux-gcc 编译器,可编译出针对 Linux ARM 平台的可执行代码。
在 Windows PC 上,利用 cygwin 环境,运行 arm-elf-gcc 编译器,可编译出针对 ARM CPU 的可执行代码。

为什么会有交叉编译

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

什么是交叉编译工具链

一般所说的工具链,指的是本地平台自己的工具链。而用于交叉编译的工具链,就是交叉工具链。交叉工具链中,gcc编译器、ld链接器以及其他的相关工具,都是用来跨平台交叉编译的。  
交叉工具链与本地工具链类似,也有交叉编译版本的gcc, ld, as等工具,与本地工具链两两对应。交叉工具链中最重要的工具还是编译器gcc,所以我们也经常把交叉工具链简称为交叉编译器,即严格意义上来讲,交叉编译器指的是交叉编译版本的gcc,但为了叫法上的方便,我们平常说的交叉编译,其实指的都是交叉工具链。  

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

测试验证

Arm 环境

##构建开发镜像
cat > Dockerfile <<"EOF"
FROM ubuntu:18.04
RUN sed -i 's#deb.debian.org#mirrors.ustc.edu.cn#g' /etc/apt/sources.list && \
  sed -i 's#security.debian.org#mirrors.ustc.edu.cn#g' /etc/apt/sources.list
RUN apt update -y
RUN apt install emdebian-archive-keyring -y
RUN apt install linux-libc-dev-mipsel-cross libc6-mipsel-cross binutils-mipsel-linux-gnu gcc-mipsel-linux-gnu gcc-8-mipsel-linux-gnu -y
RUN apt install file vim wget net-tools -y
# 开启ssh支持
RUN apt install systemd openssh-server -y
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
RUN echo "root:123" | chpasswd
EOF
docker build -t registry.cn-chengdu.aliyuncs.com/z-web/mipsel:develop ./
#docker push registry.cn-chengdu.aliyuncs.com/z-web/mipsel:develop
docker run --name=mipsel-develop --privileged=true -p 2223:22 -d registry.cn-chengdu.aliyuncs.com/z-web/mipsel:develop /sbin/init
docker exec -it mipsel-develop bash

参考

https://blog.csdn.net/weixin_45813250/article/details/120056198

交叉工具链: https://www.linaro.org/downloads/#gnu_and_llvm

https://github.com/firmianay/CTF-All-In-One/blob/master/doc/2.1.2_qemu.md

  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 1 关注

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...