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

问题描述 投票:0回答:1

我正在学习使用 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
代表什么?我理解它是“半主机”,这意味着以某种方式使用主机 I/O。这是否意味着我可以 printf 到主机控制台?我找不到任何有关如何实际使用它的文档。

这一切是否有真相来源?

gcc arm stm32 bare-metal
1个回答
41
投票

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

查看 gcc 工具链的 lib 文件夹中的这些规范文件(例如

/usr/lib/arm-none-eabi/lib
),我们可以看到提到的规范文件定义了链接器将使用哪个标准库。

例如,

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

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

© www.soinside.com 2019 - 2024. All rights reserved.