You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在arm-none-eabi-gcc中指定Cortex-A53?编译程序运行异常求助

解决Cortex-A53平台运行交叉编译程序的段错误/被Killed问题

让我们一步步拆解你的问题,找到对应的解决方案:

1. 第一个错误:生成了共享库而非可执行程序

你最初的编译命令用了-shared选项:

D:\code>arm-none-eabi-gcc hello.c -o hello -shared

这个选项的作用是生成共享库(.so文件),而不是可直接运行的二进制可执行程序。共享库是给其他程序调用的,直接执行它必然会触发Segmentation fault,这是完全正常的错误——你拿错了文件类型!

2. 第二个问题:工具链与目标平台不匹配导致程序被Killed

你后来添加了-mcpu=cortex-a53--specs=nosys.specs,但程序运行时被Killed,核心原因是:
arm-none-eabi-gcc是针对裸机、RTOS设计的交叉编译工具链,它默认链接的是newlib(一个轻量级的嵌入式C库),而你的Cortex-A53运行的是Linux系统,系统自带的是glibc,两者的ABI和系统调用实现不兼容,导致程序无法正常加载被系统杀死。

正确的解决方案

方案一:使用Linux专用的交叉编译工具链(推荐)

针对运行Linux的Cortex-A53,你应该使用arm-linux-gnueabihf-gcc这类工具链(专门为嵌入式Linux打造,链接glibc,与目标系统兼容)。

编译命令示例:

arm-linux-gnueabihf-gcc hello.c -o hello -mcpu=cortex-a53 -mfloat-abi=hard -mfpu=neon-vfpv4
  • -mcpu=cortex-a53:指定目标CPU架构
  • -mfloat-abi=hard:启用硬件浮点加速(Cortex-A53支持)
  • -mfpu=neon-vfpv4:指定A53对应的FPU型号

方案二:坚持使用arm-none-eabi-gcc(静态编译适配)

如果你只能用arm-none-eabi-gcc,需要通过静态编译把newlib打包进程序,避免依赖目标系统的glibc:

arm-none-eabi-gcc hello.c -o hello -mcpu=cortex-a53 -mfloat-abi=hard -mfpu=neon-vfpv4 --specs=nosys.specs -static
  • -static:静态链接所有依赖库,程序不依赖系统的动态库
  • 同时确保你的hello.c是标准的C程序,比如:
#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}

3. 验证步骤

编译完成后,用file命令检查生成的文件:

gec@ubuntu:/mnt/hgfs/code$ file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

确认是executable(可执行程序)而非shared object,再放到Cortex-A53平台运行即可。

内容的提问来源于stack exchange,提问作者vincent

火山引擎 最新活动