为什么 Cortex-M4 在链接器脚本中包含 ARM 到 Thumb 粘合

Mar*_*arc 5 arm linker-scripts thumb cortex-m

我们正在为 STM32 芯片上的 ARM Cortex M4 编写一些代码。

我的理解是 Cortex-M4 有一些 32 位指令,但这些不是 32 位 ARM 指令,它们只是一些特殊指令。我认为粘合剂是为了在 ARM 和拇指指令集之间转换。那么为什么链接描述文件需要胶水呢?

.text :
{
. = ALIGN(4);
*(.text)           /* .text sections (code) */
*(.text*)          /* .text* sections (code) */
*(.glue_7)         /* glue arm to thumb code */
*(.glue_7t)        /* glue thumb to arm code */
Run Code Online (Sandbox Code Playgroud)

由于处理器仅支持拇指指令,我可以删除glue_7和吗?glue_7t这样做会释放任何闪存吗?

Jos*_*ose 3

发布的脚本始终会为调用拇指/ARM 的 ARM/thumb 代码创建部分,如果没有任何内容可调用,则这些部分为空。空的部分是良性的。

如果您想删除未使用的部分而不修改链接器,一种干净的方法是执行死代码消除,通过--gc-sections

一旦使用这些选项创建了对象和静态库,链接器就可以执行死代码消除。您可以通过将 -Wl,--gc-sections 选项设置为 gcc 命令或在 gnatmake 的 -largs 部分中来完成此操作。这将对从未引用的代码和数据执行垃圾收集。