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

使用GCC编译STM32汇编代码时遇链接错误求助

问题分析与解决方案

你遇到的错误是因为GCC默认会自动链接C运行时(CRT)启动代码和标准C库,而这些组件依赖main函数和_exit等底层符号,但你的裸机汇编程序完全不需要这些,因此出现了未定义引用的错误。

错误原因拆解

  • undefined reference to 'main':CRT启动代码crt0.o会调用main函数作为程序入口,但你的汇编程序里根本没定义这个函数。
  • undefined reference to '_exit':标准库的exit函数依赖底层的_exit实现,而裸机环境下没有这个函数,也不需要它。

两种解决方法

方法1:直接使用链接器,跳过GCC的默认链接逻辑

先把汇编文件编译成目标文件,再用ld手动链接:

# 编译汇编文件为目标文件(不执行链接)
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -c main.s -o main.o
# 手动链接,指定代码段起始地址为STM32 Flash起始地址0x08000000
arm-none-eabi-ld -Ttext=0x08000000 main.o -o main.elf

方法2:用GCC编译时禁用CRT和标准库

给GCC加上两个参数,阻止它自动链接不必要的组件:

arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -nostartfiles -nostdlib main.s -o main.elf
  • -nostartfiles:不链接CRT启动文件(比如crt0.o)
  • -nostdlib:不链接标准C库和相关辅助库

额外说明

你的汇编程序里已经定义了STM32需要的向量表(栈顶+复位向量),复位向量指向的0x080000ed正好是后续nop指令的地址,编译链接后,芯片复位会执行这个nop,完全可以用来验证GCC工具链的基本功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:35:25