GCC 链接器脚本 - 将 .bss 部分拆分为多个 RAM 区域

Posted

技术标签:

【中文标题】GCC 链接器脚本 - 将 .bss 部分拆分为多个 RAM 区域【英文标题】:GCC linker script - split .bss section to multiple RAM regions 【发布时间】:2021-08-08 16:24:11 【问题描述】:

嵌入式设备有两个 SRAM 区域。首先是 0x20000000,长度为 16k。然后在 0x20040000 长度 96k。在应用程序中,生成的 .bss 部分大小为 102k,因此它不能完全适合任一 RAM 区域。它需要在两个区域之间进行拆分。如何在 .ld 链接器脚本中做到这一点?

我知道两个很笨拙的选择。

选项 A:在脚本中按名称手动选择对象并将它们分成两个部分。有了这个选项,我觉得我正在手动执行链接器应该执行的操作。

选项 B:将属性放置到源代码中以使某些对象成为特殊的 .bss2 部分。这个比选项 A 还要糟糕。

我希望链接器自动优化地跨两个内存区域拆分对象。我知道至少 IAR 链接器可以在没有任何手动工作的情况下以最佳方式完成它。

【问题讨论】:

您在链接器文档和/或互联网上的研究揭示了什么? 这里有重复的问题没有答案:***.com/questions/15156201/… 【参考方案1】:

我从一位 NXP 员工那里得知:“GNU 链接器以线性方式遍历链接器脚本文件,不会尝试填充内容或将变量分配到不同的内存区域。”您必须创建一个bss2 部分并在启动文件中初始化它,然后选择选项 A 或 B。您也可以使用其他工具链,它们中的大多数都能够将变量分配到不同的内存部分

链接器脚本:

.bss2 :
  
    . = ALIGN(4);
    __bss2_start__ = .;
    *(.bss2)
    *(.bss2.*)
    . = ALIGN(4);
    __bss2_end__ = .;
   > RAM2 AT > RAM2

【讨论】:

以上是关于GCC 链接器脚本 - 将 .bss 部分拆分为多个 RAM 区域的主要内容,如果未能解决你的问题,请参考以下文章

如何将 vue 单个组件模板部分拆分为更小的子模板

将变量从.bss移动到.data是危险的吗?

python - 如何首先根据初始列表的单个元素将列表拆分为子列表,然后在python中将列表的连续部分拆分为子列表?

如何在命令行中使 gcc 链接器输出节大小?

链接器脚本:我可以在多个部分中指定 (*COMMON) 吗?

2016.4.6 链接器脚本文件的编写