首页 > 解决方案 > arm-none-eabi 工具链中默认启动文件和链接器脚本的用途?

问题描述

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

标签: armembedded

解决方案


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

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

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

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

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

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


推荐阅读