什么是「;“nosys”&引用;“nano”&引用;rdimon“;使用ARM GCC时的术语?

什么是「;“nosys”&引用;“nano”&引用;rdimon“;使用ARM GCC时的术语?,gcc,arm,stm32,bare-metal,Gcc,Arm,Stm32,Bare Metal,我正在学习使用GCC工具链编写ARM代码。我遇到了一些我找不到文档的GCC选项。有人能解释一下他们是干什么的吗 -specs=nosys.specs -specs=nano.specs -specs=rdimon.specs -lnosys -specs=nosys.specs和-lnosys有什么关系?你是一起使用它们,还是它们彼此排斥,还是其他什么 还有nano,我想暗示一下使用newlib nano库。我见过它与-lm和-lc一起使用。这是否只是提供了标准的libc和libm函数 rd

我正在学习使用GCC工具链编写ARM代码。我遇到了一些我找不到文档的GCC选项。有人能解释一下他们是干什么的吗

  • -specs=nosys.specs
  • -specs=nano.specs
  • -specs=rdimon.specs
  • -lnosys
-specs=nosys.specs
-lnosys
有什么关系?你是一起使用它们,还是它们彼此排斥,还是其他什么

还有nano,我想暗示一下使用newlib nano库。我见过它与
-lm
-lc
一起使用。这是否只是提供了标准的libc和libm函数

rdimon
代表什么?我理解它是为了“半托管”,即以某种方式使用主机IO。这是否意味着我可以将printf打印到主机控制台?我找不到关于如何实际使用这个的文档

如果我在某个地方没有找到这一切的真相来源,请告诉我

感谢您在澄清方面提供的帮助。

Gcc使用规范字符串,它控制要运行的子流程以及要传递给它们的参数。可以使用等级库文件覆盖等级库字符串定义的行为,等级库文件的用途和语法如下所示:

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

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

nosys.specs:

%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的系统包含路径和库参数。spec文件包含对
-lc
和其他纳米等效物的替换,例如
-lc\u nano
。因此,将其与这些结合使用将使gcc仍然将nano库传递给链接器


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

hi,这很有帮助。我在某处看到“-spec=aem.ve specs”。你也能告诉我一些关于这方面的事情吗?在编译命令中设置这两个规范(“-specs=nano.specs-specs=nosys.specs”)有意义吗?你期望的效果是什么?这是通过nosys.specs覆盖nano.specs的内容(如功能)还是“仅”添加不存在的内容?@ChanKim在我看来,aem.ve-specs也通过了-lrdimon。但是周围有不同的文件,所以要真正了解它,你可以查看工具链中的文件。@Guti_Haz你可以有多个规范文件,并且它们是按顺序处理的。由于这些指令可能会覆盖规范字符串,因此它们可能会冲突。但是你可以在文件中看到,它们通常只是附加选项,所以这两个更改都被应用。当你按顺序添加nano和nosys时,你会得到-lnosys和-lc_nano。