You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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驱动)
  • 修正链接脚本错配:__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:21:21