09-ARM开发板的HelloWorld

在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之后交叉编译又能运行了)

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移植程序到 ARM 开发需要涉及以下几个方面: 1. 交叉编译工具链的安装 ARM 开发和 PC 使用的是不同的 CPU 架构,因此需要使用交叉编译工具链来编译 ARM 平台的程序。可以在 PC 上安装交叉编译工具链,具体安装方法可以参考对应的交叉编译工具链文档。 2. 修改 makefile 或 CMakeLists.txt 由于 ARM 平台和 PC 平台的编译器、库文件等不同,因此需要修改程序的 makefile 或 CMakeLists.txt 文件,以保证程序能够正确编译。 3. 调试程序 移植程序到 ARM 开发后,需要进行调试。可以使用 gdb 等调试工具,或者通过串口输出调试信息。 举例: 假设我们要将一个使用了动态链接库的 C 程序移植到 ARM 开发上。 1. 安装交叉编译工具链 假设我们使用的是 arm-none-eabi-gcc 工具链,可以在 PC 上安装该工具链: ``` sudo apt-get install gcc-arm-none-eabi ``` 2. 修改 makefile 假设程序的 makefile 如下: ``` CC=gcc CFLAGS=-Wall -O2 LDFLAGS=-L./lib -lfoo all: main main: main.o $(CC) $(LDFLAGS) -o $@ $^ main.o: main.c $(CC) $(CFLAGS) -c -o $@ $^ clean: rm -f main main.o ``` 我们需要修改 makefile,以使用 arm-none-eabi-gcc 工具链,并指定库文件的路径和名字: ``` CC=arm-none-eabi-gcc CFLAGS=-Wall -O2 LDFLAGS=-L./lib -lfoo all: main main: main.o $(CC) $(LDFLAGS) -o $@ $^ main.o: main.c $(CC) $(CFLAGS) -c -o $@ $^ clean: rm -f main main.o ``` 3. 调试程序 移植程序到 ARM 开发后,可以使用 gdb 等调试工具进行调试,也可以通过串口输出调试信息。例如,在程序中添加如下代码: ``` #include <stdio.h> int main() { printf("Hello world!\n"); return 0; } ``` 然后在 ARM 开发上编译、运行该程序,可以通过串口查看输出结果: ``` $ ./main Hello world! ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值