我正在学习使用 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 使用 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 可能会崩溃。