Cygwin下GCC编译ARM Cortex程序报ld returned 1 exit错误
Traveo Cortex-M0+ 交叉编译ld链接错误解决方案
所有未定义符号可以按三类根因逐一排查修复:
1. 驱动库与启动相关符号未定义(SystemInit/Cy_*开头API/__cm4_vector_base_linker_symbol)
这类符号全部来自Infineon(原Cypress)Traveo PDL外设驱动库与双核配套启动逻辑,缺失原因是Makefile编译链接列表不全、配置错配:
- 补全缺失的源文件到Makefile的
SRC编译列表:- CM0+核对应的启动汇编文件(通常命名匹配你使用的具体Traveo型号,格式类似
startup_tviibe_cm0plus.S) - 系统初始化源文件
system_cm0plus.c - PDL库
drivers/src路径下对应你调用API的驱动源文件:cy_gpio.c、cy_sysclk.c、cy_systick.c、cy_sysint.c、cy_ipc.c(双核启动必须加IPC驱动)
- CM0+核对应的启动汇编文件(通常命名匹配你使用的具体Traveo型号,格式类似
- 修正链接脚本错配:
__cm4_vector_base_linker_symbol是双核Traveo的CM0+侧链接脚本专属符号,你当前使用的是Cortex-M4核的链接脚本,替换为SDK中对应CM0+核的.ld文件即可。 - 补全核类型编译宏:在
CFLAGS中添加-DCY_CORTEX_M0P,否则PDL驱动会默认按CM4核条件编译,导致CM0+侧的函数符号未生成。
2. _exit符号未定义
这个是arm-none-eabi-gcc自带newlib库的系统调用桩缺失问题,裸机环境无操作系统支持时,二选一修复即可:
- 最简方案:在链接参数
LDFLAGS中添加--specs=nosys.specs,调用工具链自带的nosys桩库自动补全_exit、_sbrk、_write等所有需要的系统调用空实现 - 自定义实现:在工程任意C源文件中添加最小桩函数:
#include <stdint.h> void _exit(int status) { (void)status; while(1) { __asm volatile ("nop"); } }
3. Makefile规则校验
你提到错误定位到main_cm0plus.o的规则行,本质是链接阶段的输入文件不全:
- 确认链接规则的依赖项包含所有编译生成的
.o文件,不要仅把main_cm0plus.o作为唯一输入喂给链接器 - 核对编译架构参数:
CFLAGS和LDFLAGS中必须统一添加-mcpu=cortex-m0plus -mthumb,不要混用Cortex-M4的架构参数,否则会触发指令集、符号不匹配问题 - 执行make时加
V=1参数打印完整编译链接命令,核对链接阶段输入的目标文件列表、链接脚本路径、宏定义参数是否符合上述要求,逐行核对即可快速定位漏加的文件。
内容的提问来源于stack exchange,提问作者mrm
相关产品推荐
相关产品推荐

