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

Clang在Thumb模式下编译Cortex-M0固件链接错误ARM内置函数问题

问题根因

你遇到的问题是链接的libgcc.a版本不匹配导致的:你当前使用的/path/to/newlib/lib/gcc/arm-none-eabi/9.2.1/libgcc.a是通用ARM架构的版本,其中的内置辅助函数均为ARM模式,和Cortex-M0仅支持的Thumb指令集不兼容。

修复方案

1. 替换正确架构的libgcc

将链接参数中libgcc.a的路径替换为对应ARMv6-M Thumb架构的版本,通常路径为:

/path/to/newlib/lib/gcc/arm-none-eabi/9.2.1/thumb/v6-m/nofp/libgcc.a

该路径和你已经使用的libc_nano.a架构版本完全匹配,其中所有函数均为合法的Thumb模式。

2. 调整链接顺序

建议调整链接参数的顺序,遵循「目标文件→系统库→运行时库」的顺序,避免符号解析错误:

clang -o my_project.elf --target=armv6m-none-eabi -nostdlib \
-L"/path/to/newlib/arm-none-eabi/lib/." \
-mcpu=cortex-m0 -mthumb -mfloat-abi=soft -g3 \
-Wl,--gc-sections -T my_linker_script.ld \
object_file1.o object_file2.o object_file3.o \
"/path/to/newlib/arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a" \
-lm \
"/path/to/newlib/lib/gcc/arm-none-eabi/9.2.1/thumb/v6-m/nofp/libgcc.a"

3. 验证修复结果

编译完成后可通过arm-none-eabi-objdump -d my_project.elf命令查看__udivsi3这类内置函数的指令类型,确认其为Thumb指令,同时函数地址最低有效位为1即可。

补充说明

你之前配置的编译、链接参数(包括--target=armv6m-none-eabi、-mthumb、-mcpu=cortex-m0)均正确,Clang本身对Cortex-M0的支持没有问题,只是由于裸机场景下Clang不自带运行时辅助函数实现,才会依赖链接的libgcc.a提供这类函数,只要替换为对应架构的运行时库即可解决问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:36:02