代码之家  ›  专栏  ›  技术社区  ›  harper

获取链接器映射文件中的变量地址

  •  0
  • harper  · 技术社区  · 7 年前

    在微控制器的程序中,某些区域必须在一个特殊的存储区中。它们在C源文件中声明为

    static int Foo __attribute__((section(".ocm")));
    

    MEMORY {
      ram_0 : ORIGIN = 0, LENGTH = 0x100000
      ram_1 : ORIGIN = 0xFFFF0000, LENGTH = 0xFE00
    }
    
    SECTION {
    .text : {
      //     here are the normal sections
      } > ram_0
    
    .ocm (NOLOAD) : {
        __ocm_start = .;
        *(.ocm)
        __osm_end = .;
      } > ram_1
    }
    

    使用该配置,所有符号都包含在映射文件中。但是变量 Foo 不见了。NOLOAD属性可以应用,因为该部分中没有初始化的变量。这是必要的,因为ELF输出是后处理的,并且该部分必须从该进程中排除。

    如何说服链接器在映射文件中包含特殊部分中的符号?

    1 回复  |  直到 7 年前
        1
  •  1
  •   harper    7 年前

    不幸的是,GNU链接器只列出公共符号。如果变量声明为 static 因为它对于文件范围是私有的,所以不会在映射文件中列出。必须更改代码以在映射文件中获取其地址:

    int Foo __attribute__((section(".ocm")));