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

