GCC 链接器 - 在 .text 部分中的特定地址找到一个部分/常量

问题描述 投票:0回答:0

我想在 .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

如何让我的常量位于 0x080017FC(代码)部分内的 .text 而没有任何重叠错误?

c constants linker-errors memory-address sections
© www.soinside.com 2019 - 2024. All rights reserved.