使用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
相关产品推荐
相关产品推荐

