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

时间:2019-01-29 12:30:21

标签: gcc ld

在用于微控制器的程序中,某些区域必须位于特殊的存储区中。这些已在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 个答案:

答案 0 :(得分:1)

不幸的是,GNU链接器仅列出了公共符号。如果变量声明为static,因为它是文件作用域的私有变量,则不会在映射文件中列出。有必要更改代码以在地图文件中获取其地址:

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