首页 > 解决方案 > 使用 ARM GCC 时,什么是“nosys”、“nano”、“rdimon”术语?

问题描述

我正在学习使用 GCC 工具链编写 ARM 代码。我遇到了一些我找不到文档的 GCC 选项。有人可以帮助解释他们的工作吗?

怎么做-specs=nosys.specs-lnosys关联?你是一起使用它们,还是它们是相互排斥的,还是别的什么?

和 nano,我聚集在一起暗示使用 newlib-nano 库。-lm我已经看到它与and结合使用-lc。这是否只是为您提供标准的 libc 和 libm 功能?

代表什么rdimon?我知道这是为了“半主机”,这意味着以某种方式使用主机 IO。这是否意味着我可以 printf 到主机控制台?我找不到有关如何实际使用它的文档。

如果我还没有找到所有这一切的真相来源,请告诉我。

感谢您对澄清的任何帮助。

标签: gccarmstm32bare-metal

解决方案


Gcc 使用specs-strings,它控制要运行的子进程以及它应该传递给它们的参数。可以使用spec-files覆盖由规范字符串定义的行为,其目的和语法在此处记录:https ://gcc.gnu.org/onlinedocs/gcc/Spec-Files.html

查看 gcc 工具链的 lib 文件夹中的这些规范文件(例如/usr/lib/arm-none-eabi/lib),我们可以看到提到的规范文件定义了链接器将使用哪个标准库。

例如,nosys.specs只需定义系统调用应实现为调用时返回错误的存根 ( -lnosys)。在这种情况下,libc 的选择取决于是否应该使用nano 。使用libgcc 规范字符串%G进行处理,它定义了传递给链接器的参数。

nosys 规格:

%rename link_gcc_c_sequence                nosys_link_gcc_c_sequence

*nosys_libgloss:
-lnosys

*nosys_libc:
%{!specs=nano.specs:-lc} %{specs=nano.specs:-lc_nano}

*link_gcc_c_sequence:
%(nosys_link_gcc_c_sequence) --start-group %G %(nosys_libc) %(nosys_libgloss) --end-group

nano.specs定义系统包含路径和库参数以使用newlib-nano-lc规范文件包含纳米等价物的替换和其他内容,例如-lc_nano. 所以将它与这些结合使用将使 gcc 仍然将 nano 库传递给链接器。

使用rdimon.specs,作为标准库的libgloss部分-lrdimon传递。这基本上意味着您可以使用系统调用(以及 printf),但这依赖于附加的调试器,如果不存在调试器,CPU 可能会崩溃。


推荐阅读