在ARM开发板上运行x86_64平台程序
前面在Ubuntu系统编译生成了X86_64平台的HelloWorld程序,通过NFS服务器,尝试在开发板上直接运行。
如图所示,程序无法正常运行,终端提示ARM开发板在执行x86架构(Intel或AMD)的hello程序时提示格式错误,原因是x86_64和ARM架构的程序不兼容,本质是由于这些CPU使用的指令集不同。
安装交叉编译工具链
- 编译器和目标程序都是相同架构的编译过程,被称为本地编译
- 编译器和目标程序运行在不同架构的编译过程,被称为交叉编译
前面就有提过交叉编译,为什么需要交叉编译,是因为通常编译工具链对编译环境有较高的要求,编译复杂的程序时,可能需要巨大的存储空间以及强大的CPU运算能力加快编译速度。常见的ARM架构平台资源有限,无论是存储空间还是CPU运算能力,都与X86平台相去甚远。
交叉编译器:能进行架构“交叉”编译过程的编译器。
安装ARM-GCC
安装交叉编译工具链有如下三种方式:
- 直接在Ubuntu下使用APT包管理工具下载安装,操作简单(本篇文章使用)
- 自行下载第三方制作好的工具链,如Linaro,好处是选择丰富,能找到很多不同的版本。
- 使用crosstool-ng根据需要自己制作,过程复杂不推荐。
安装命令:
sudo apt install gcc-arm-linux-gnueabihf
# 安装完毕后使用如下命令查看版本
arm-linux-gnueabihf-gcc–v
交叉编译helloworld程序
主机安装好交叉编译工具器后,执行如下命令对helloworld程序进行交叉编译:
arm-linux-gnueabihf-gcc hello.c -o hello
# 使用如下命令查看交叉编译器生成的hello程序
readelf -a hello
从上图可以看到hello程序的系统架构为ARM平台,可以尝试通过NFS在开发板上运行。
如果不能运行,而且提示glibc版本问题,很可能是因为系统版本问题。(本人之前用的Ubuntu22.04交叉编译出来的程序在开发板上提示gblic版本不对应,程序运行不了,除了想到能静态编译想不到其他方法,后面换了Ubuntu18.04之后交叉编译又能运行了)