【问题标题】:Purpose of default startfiles and linker scripts in arm-none-eabi toolchain?arm-none-eabi 工具链中默认启动文件和链接器脚本的用途?
【发布时间】:2021-03-13 00:50:52
【问题描述】:

Arm-none-eabi 工具链始终与 -nostartfiles 标志一起使用以排除默认 crt 和每个微控制器的自定义链接器脚本,那么它们中的默认值的用途是什么(位于 /usr/lib/arm-没有eabi/)?什么时候用的?

【问题讨论】:

  • 就像在其他所有平台上一样。当您本地构建时。 gcc hello_world.c -o hello_world
  • 为了回答您的问题,为newlib support 配置了“none-eabi”。它需要您实现一组有限的函数,然后默认环境将允许您在嵌入式平台上使用许多“C”库函数。具体来说,您需要实现syscall functions 或避免使用一些“C”库函数……这是个好问题。

标签: arm embedded


【解决方案1】:

我不知道在任何情况下您会使用未经编辑的默认链接描述文件,尽管它是设置您自己的版本的有用模板。

默认启动文件包含您可能需要也可能不需要的初始化例程。

如果你只为 C 编译并且你不使用任何不纯的 C 库函数,那么你可以使用 -nostartfiles,但是如果你使用 C++ 或保持某些状态的库函数,那么启动文件可能会执行必要的初始化。您可以阅读 C 库的源代码了解详细信息。

如果您手动编写链接描述文件,则实际上不需要指定 -nostartfiles,因为您可以更精细地控制链接描述文件中包含和排除的内容。如果您使用 --gc-sections 链接器选项删除未引用的所有内容,则将 startfiles 用作链接器输入是无害的。

例如,许多嵌入式目标旨在永远启动和运行,并且永远不会关闭/完成/退出。您可以使用 -nostartfiles 在链接脚本中排除 .fini 和相关部分,而不会丢失您需要的内容。

查看此问题的最佳方法是编译一个您正在使用和不使用该选项的真实项目,并查看映射文件或反汇编是否有任何差异。

【讨论】:

  • 您可能希望查看我在问题中的评论以改进您的答案。
  • 您的评论大部分是正确的,但我没有看到与该问题相关的任何内容。 arm-none-eabi 通常使用 newlib 但不是必须的。如果您确实使用 newlib,则除非您使用某些不纯的函数,否则您不必实现系统调用,正如我在回答中已经说过的那样。例如:strlen 是纯的,您可以在不定义系统调用的情况下使用它。 malloc 不纯,需要定义 sbrk。 Newlib 的 malloc 不需要任何初始化,除了可能复制初始化的数据和归零 bss,但可能还有其他不纯的函数。如果你使用一个,你不应该使用 nostartfiles。
  • newlib 是 OP 提出的唯一问题的答案,它们何时使用? 或“它们何时使用 [默认链接器脚本]?”或问题标题“arm-none-eabi 工具链中默认启动文件和链接器脚本的用途?”
  • 我发现 blogpost 关于 newlib 和它的 startfiles 很有趣。正如我从这篇文章中了解到的那样,newlib 的 startfiles 不执行除 bss 归零之外的任何初始化,因此可以将它们排除在外。默认工具链的链接器脚本只能用于使用半主机进行调试。
  • 我不想在堆栈交换答案中详细介绍,但该链接很有帮助!为什么你必须有 startfiles 的一个例子是 __libc_init_array 调用需要 startfiles 的 init (即使它可能什么都不做)。如果你不调用 __libc_init_array 那么你的初始化器不会被全局 C++ 对象调用。显然,您可以通过其他方式自己调用它们,但是您正在重新发明轮子,只是为了在 .init 部分中节省大约 12 字节的闪存。
猜你喜欢
  • 2017-10-10
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2016-05-28
  • 2011-08-23
  • 2018-01-04
  • 2016-08-30
相关资源
最近更新 更多