Linker 将字符串放在.text节中的特定地址上
我需要在STM32F4的.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
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。我仍然很高兴有一种更优雅的方式来解决这个问题哦,现在我明白了。事实上,我过去也遇到过同样的问题,但找不到好的解决办法。