我想在.text(代码)部分的特定地址(0x080017FC)中找到一个32位常量值。
老实说,当涉及到修改链接器脚本到这个程度,我很天真,觉得我不知道该怎么做。
我已经修改了链接器脚本,以便在.text节中包含这个新节(.systemid)。
.text :
{
. = ALIGN(4);
KEEP(*(.systemid))
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */
} >FLASH
为了确保它不会被优化掉,我使用了KEEP。
然后我在新的节(.systemid)
中声明了常量,这时我开始思考我应该做什么,如果.systemid
是一个独立的节,我应该如下声明常量:
const uint32_t __attribute__((used, section (".systemid"))) SYSTEM_ID_U32 = 0x11223344;
但既然这是一节中的一节,难道不应该吗?:
uint32_t __attribute__((used, section (".text.systemid"))) SYSTEM_ID_U32 = 0x11223344;
所以链接器会将常量定位在.text section (0x000001A0)
的开头。很好,它在文本部分中,但地址不正确。我想将常量定位在0x08001F7C
。
为了尝试实现这一点,我将以下内容传递给链接器:
-Wl,--section-start=.text.systemid=0x080017FC
同样,我不确定它应该是.systemid
还是.text.systemid
无论哪种方式,它都不会将常量定位在0x080017FC
如何使常量位于.text
(代码)部分中的0x080017FC
,而不出现任何重叠错误?
1条答案
按热度按时间waxmsbnn1#
它不会这样工作。如果它是另一个节的一部分,我不可能意识到将节放在特定地址而不出现链接器的问题。链接器是一个相当简单的程序,不会优化内存以避免您的位置。
我使用两种方法:
1.把这个id放在FLASH的末尾。你不能在开始的时候这样做,因为有向量表。
放置在FLASH中所有其他部分之后(它可以是最后一个部分定义
或