Linker 将字符串放在.text节中的特定地址上

Linker 将字符串放在.text节中的特定地址上,linker,arm,gnu,Linker,Arm,Gnu,我需要在STM32F4的.text部分中的特定地址上放置一个常量字符串。我的记忆应该是这样的: 0x08000000 - 0x08007FFF reserved for bootloader 0x08008000 - 0x08012FFF .text (part1) 0x08013000 - 0x0801303F String constant (64 bytes reserved) 0x08013040 - (end of flash) .text (part2) L

我需要在STM32F4的.text部分中的特定地址上放置一个常量字符串。我的记忆应该是这样的:

0x08000000 - 0x08007FFF     reserved for bootloader
0x08008000 - 0x08012FFF     .text (part1)
0x08013000 - 0x0801303F     String constant (64 bytes reserved)
0x08013040 - (end of flash) .text (part2)
LD脚本当前的定义如下:

MEMORY
{
  ROM     (rx)  : ORIGIN = 0x08008000, LENGTH = 512K
  RAM     (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}

_IDENTIFICATION_START = 0x8013000;

SECTIONS
{   
  .text :
  {
    KEEP(*(.isr_vector))
    *(.text*)

    /* < init, ctors, dtors & rodata truncated for readability> */
  } > ROM

  .identification _IDENTIFICATION_START :
  {
    KEEP(*(.identification)) ;
  }

  /* < truncated for readability> */
}
内存
{
ROM(rx):原点=0x0800800,长度=512K
RAM(rwx):原点=0x20000000,长度=128K
}
_标识_启动=0x8013000;
部分
{   
.案文:
{
保持(*(isr_向量))
*(.文本*)
/**/
}>ROM
.标识_标识_开始:
{
保持(*(身份));
}
/*<为可读性而截断>*/
}
但是得到一个重叠警告。 我试过这个:

MEMORY
{
  ROM1     (rx)  : ORIGIN = 0x08008000, LENGTH = 0xB000
  ROM2    (rx)  : ORIGIN = 0x08013080, LENGTH = 512K
  RAM     (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}

_IDENTIFICATION_START = 0x8013000;
_FWADDRESS_START = 0x8013020;


SECTIONS
{
  .text :
  {
    KEEP(*(.isr_vector))
    *(.text*)
  } > ROM1

  .text :
  {
    *(.text*)

    /* < init, ctors, dtors & rodata truncated for readability> */
  } > ROM2

  .identification _IDENTIFICATION_START :
  {
    KEEP(*(.identification)) ;
  }

  /* < truncated for readability> */
}
内存
{
ROM1(rx):原点=0x0800800,长度=0xB000
ROM2(rx):原点=0x08013080,长度=512K
RAM(rwx):原点=0x20000000,长度=128K
}
_标识_启动=0x8013000;
_FWADDRESS_START=0x8013020;
部分
{
.案文:
{
保持(*(isr_向量))
*(.文本*)
}>ROM1
.案文:
{
*(.文本*)
/**/
}>ROM2
.标识_标识_开始:
{
保持(*(身份));
}
/*<为可读性而截断>*/
}
现在它完全忽略区域ROM1,将所有内容都放在ROM2中,但我还需要代码的开头0x0800800,因为这是引导加载程序跳转到的地址


是否有人知道如何分割.text,在其中留下一个空白,我可以放置字符串const?

一种方法是创建一个节,然后在源代码中使用它,如本例中的堆栈[1]:

charstack[10000]uuu属性uuu((节(“堆栈”))={0};


[1]

一种方法是创建一个节,然后在源代码中使用该节,如本例中的堆栈[1]:

charstack[10000]uuu属性uuu((节(“堆栈”))={0};


[1]

创建一个节并在其中放置一个变量不是问题,我们已经在其他一些项目中这样做了。问题是将此节放在.text节中,告诉链接器自动链接此节周围的.text。通过在常量字符串之前手动放置一些.o-files.text节,并在ROM节中调用*(.text)之前调用KEEP(*(.identification))来解决此问题。不是第一种最优雅的方式。文本可能会改变,让我不时检查地图文件,以确保我不会浪费太多的ROM。我仍然很高兴有一种更优雅的方式来解决这个问题哦,现在我明白了。事实上,我在过去也遇到过同样的问题,但找不到一个好的解决方案。创建一个节并在其中放置一个变量不是问题,我们已经在其他一些项目中这样做了。问题是将此节放在.text节中,告诉链接器自动链接此节周围的.text。通过在常量字符串之前手动放置一些.o-files.text节,并在ROM节中调用*(.text)之前调用KEEP(*(.identification))来解决此问题。不是第一种最优雅的方式。文本可能会改变,让我不时检查地图文件,以确保我不会浪费太多的ROM。我仍然很高兴有一种更优雅的方式来解决这个问题哦,现在我明白了。事实上,我过去也遇到过同样的问题,但找不到好的解决办法。