当使用ARM GCC时,“nosys”,“nano”和“rdimon”术语是什么?

44

我正在学习使用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?我找不到有关如何实际使用此功能的文档。

如果有一个我没有发现的所有信息来源,请告诉我。

感谢任何有助于澄清的帮助。


"rdimon"类似于“远程调度接口监视器”。它安装了模拟系统调用的代码,但是通过调试器陷阱执行主机上的代码。因此,在目标上有一小组存根,用于“打开”的系统调用最终会在主机上打开一个文件(对于read()/write()等也是如此)。您需要运行initialise_monitor_handles()来安装它们,而且该代码在JTAG/SW调试器下运行。 - artless noise
1个回答

39

Gcc使用规格字符串,用于控制运行哪些子进程以及它应该向它们传递什么参数。由规格字符串定义的行为可以使用规格文件进行覆盖,这里记录了其目的和语法: https://gcc.gnu.org/onlinedocs/gcc/Spec-Files.html

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

例如,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 时的系统包含路径和库参数。该规范文件包含了用于 nano 相关的替代项,例如 -lc_nano 取代 -lc 等等。因此,与这些一起使用可以使 gcc 将 nano 库传递给链接器。

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


1
嗨,这很有帮助。我在某处看到了“-spec=aem.ve-specs”,你也能告诉我点相关信息吗? - Chan Kim
6
将两个规范(“-specs = nano.specs”和“-specs = nosys.specs”)都设置在编译命令中是否有意义?你期望看到哪些效果?这是否会通过nosys.specs覆盖nano.specs的内容(例如函数),还是仅添加不存在的内容? - Guti_Haz
2
@ChanKim 看起来对我来说,aem.ve-specs 也通过了 -lrdimon。但是有不同的版本,因此要想真正确定,您可以查看工具链中的文件。 - jf_
4
您可以拥有多个规格文件,并且它们会按顺序处理。由于这些文件包含指令,可能会覆盖规格字符串,因此它们可能会发生冲突。但是您可以在文件中看到它们通常只追加选项,因此两个更改都会应用。 - jf_
4
当您按顺序添加nano和nosys时,您会得到-lnosys和-lc_nano。 - jf_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接