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

如何构建GCC ARM项目:保留newlib-nano且禁止依赖libgcc

如何保留newlib-nano链接能力,同时在依赖libgcc时触发错误

问题场景

用--specs=nano.specs --specs=nosys.specs编译嵌入式代码时,只要代码里有浮点运算这类依赖,编译器还是会自动链接libgcc。但如果加-nostdlib,会连newlib-nano一起剔除,导致构建失败。要实现的目标是:保留链接newlib-nano的能力,一旦代码用到newlib-nano没有但libgcc有的符号,直接触发链接错误,而不是偷偷链接libgcc。

解决方法

方法一:用-nodefaultlibs手动指定链接newlib-nano

这个选项会关掉所有默认标准库的自动链接,你可以手动添加newlib-nano的必要库,完全不碰libgcc。示例命令:

arm-none-eabi-gcc your_code.c --specs=nano.specs --specs=nosys.specs -nodefaultlibs -lc -lnosys -lm -o output.elf
  • -lc:链接newlib-nano的C标准库
  • -lnosys:对应nosys.specs的系统桩函数
  • -lm:newlib-nano的数学库(如果项目用到浮点相关函数就加)

这样一来,要是代码里有依赖libgcc的符号(比如软浮点运算的__divdi3、__moddi3这类函数),链接器会直接抛出未定义符号的错误,正好符合需求。

方法二:修改nano.specs文件,移除libgcc自动链接逻辑

找到交叉编译器里的nano.specs文件(一般在arm-none-eabi/lib/specs路径下),找到里面涉及libgcc链接的段落,比如:

*lib:
%{!shared: %{!pg: %{!p: -lgcc}}} %{!shared: %{pg: -lgcc_p}} %{shared: -lgcc_s}

把这段改成触发错误的逻辑,比如:

*lib:
%{!shared: %{!pg: %{!p: -Wl,--undefined=__libgcc_dependency_detected__}}} %{!shared: %{pg: -Wl,--undefined=__libgcc_dependency_detected__}} %{shared: -Wl,--undefined=__libgcc_dependency_detected__}

这样当编译器原本要链接libgcc时,会触发未定义符号__libgcc_dependency_detected__的错误,同时保留newlib-nano的其他链接规则。注意改之前先备份原文件,避免影响其他项目。

注意事项

  • 手动指定库时,要根据项目需求选加newlib-nano的组件,比如不需要浮点就可以去掉-lm,要是代码里用到了newlib-nano没有的浮点函数,会直接报错,这正是我们要的。
  • 修改spec文件会全局影响这个编译器的所有项目,要是只针对单个项目,优先用方法一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:20:41