如何在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




