GCC链接器-在.text节中的特定地址处定位节/常量

e0bqpujr  于 2023-02-21  发布在  其他
关注(0)|答案(1)|浏览(116)

我想在.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,而不出现任何重叠错误?

waxmsbnn

waxmsbnn1#

它不会这样工作。如果它是另一个节的一部分,我不可能意识到将节放在特定地址而不出现链接器的问题。链接器是一个相当简单的程序,不会优化内存以避免您的位置。
我使用两种方法:
1.把这个id放在FLASH的末尾。你不能在开始的时候这样做,因为有向量表。

const uint32_t __attribute__((used, section (".systemid"))) SYSTEM_ID_U32 = 0x11223344;

放置在FLASH中所有其他部分之后(它可以是最后一个部分定义

.systemid :
  {
    . = ORIGIN(FLASH) + LENGTH(FLASH) - 4;
    KEEP(*(.systemid))
  } >FLASH

.systemid ORIGIN(FLASH) + LENGTH(FLASH) - 4:
  {
    KEEP(*(.systemid))
  } >FLASH

相关问题