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

GCC链接器脚本-将.bss节拆分为多个RAM区域,gcc,linker,embedded,ld,linker-scripts,Gcc,Linker,Embedded,Ld,Linker Scripts,嵌入式设备有两个SRAM区域。首先为0x20000000,长度为16k。然后在0x20040000长度96k处。在应用程序中,生成的.bss节大小为102k,因此它不完全适合任何一个RAM区域。它需要在两个区域之间进行分割。如何在.ld链接器脚本中执行此操作 我知道有两个选择很难 选项A:在脚本中按名称手动拾取对象,并将其拆分为两个部分。有了这个选项,我感觉就像是在手动执行链接器应该执行的操作 选项B:将属性放在源代码中,使一些对象成为特殊的.bss2部分。这比方案A更糟糕 我希望链接器能够在两

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

我知道有两个选择很难

选项A:在脚本中按名称手动拾取对象,并将其拆分为两个部分。有了这个选项,我感觉就像是在手动执行链接器应该执行的操作

选项B:将属性放在源代码中,使一些对象成为特殊的.bss2部分。这比方案A更糟糕


我希望链接器能够在两个内存区域之间自动以最佳方式分割对象。我知道,至少IAR linker在没有任何手动操作的情况下可以达到最佳效果。

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

链接器脚本:

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

你在链接器文档和/或互联网上的研究揭示了什么?这里有一个重复的问题,没有答案: