如何构建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
相关产品推荐
相关产品推荐

