gcc - 使用 ARM GCC 时,什么是“nosys”、“nano”、“rdimon”术语?
问题描述
我正在学习使用 GCC 工具链编写 ARM 代码。我遇到了一些我找不到文档的 GCC 选项。有人可以帮助解释他们的工作吗?
-specs=nosys.specs
-specs=nano.specs
-specs=rdimon.specs
-lnosys
怎么做-specs=nosys.specs
和-lnosys
关联?你是一起使用它们,还是它们是相互排斥的,还是别的什么?
和 nano,我聚集在一起暗示使用 newlib-nano 库。-lm
我已经看到它与and结合使用-lc
。这是否只是为您提供标准的 libc 和 libm 功能?
代表什么rdimon
?我知道这是为了“半主机”,这意味着以某种方式使用主机 IO。这是否意味着我可以 printf 到主机控制台?我找不到有关如何实际使用它的文档。
如果我还没有找到所有这一切的真相来源,请告诉我。
感谢您对澄清的任何帮助。
解决方案
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 可能会崩溃。
推荐阅读
- python - 如何在不使用 isalnum() 的情况下确定字符串中的所有字符是否都是字母数字?
- java - 滚动 RecyclerView 并将 LongClickListener 分配给 ImageView
- javascript - 使用反引号的字符串中的 Javascript if 语句
- php - 我需要从标题中获取单个单词,然后作为单个关键字插入 rankmath
- powershell - 使用 Powershell 创建子文件夹
- html - 如何为网站创建通知?
- python - 网页抓取到 excel,文本错位(selenium,python)
- css - min-height 和 max-height 属性值的实现区别
- python - 如何在 Matplotlib 中生成嵌套图例
- c# - API 类的通用类型