【问题标题】:Get variable addresses in linker map file获取链接器映射文件中的变量地址
【发布时间】:2019-01-29 12:30:21
【问题描述】:

在用于微控制器的程序中,某些区域必须位于特殊的内存段中。这些已在 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 输出是经过后处理的,并且该部分必须从该处理中排除。

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

【问题讨论】:

    标签: gcc ld


    【解决方案1】:

    不幸的是,GNU 链接器只列出了公共符号。如果变量声明为static,因为它对于文件范围是私有的,则它不会在映射文件中列出。需要修改代码来获取它在地图文件中的地址:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 2015-04-30
      • 2020-09-07
      • 1970-01-01
      • 2020-12-06
      • 2010-10-13
      • 2020-02-24
      相关资源
      最近更新 更多