首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC (NOLOAD)-directive导致内存映射错误

GCC (NOLOAD)-directive导致内存映射错误
EN

Stack Overflow用户
提问于 2018-02-13 10:08:11
回答 2查看 773关注 0票数 0

我和GCC一起工作。以下是我的.ld文件中的相关部分。

代码语言:javascript
复制
MEMORY
{
   MEMORY_1                : ORIGIN = 0xB014D000,          N
   ....
   MEMORY_N                : ORIGIN = 0x9C00C800,          LENGTH = X*K
}
SECTIONS
{
   ....
 .my_section  ALIGN(32)           (NOLOAD)  : { } > MEMORY_1
   ....
}

代码处的全局缓冲区缺陷:

代码语言:javascript
复制
static U32 __attribute__((section(".my_section"))) gBuffer[size];

我希望gBuffer[]地址在MEMORY_1,但是它的地址是0x9c0*****,即MEMORY_N。为什么?我怎么才能修好它?

编辑:我发现在删除NOLOAD指令后,位于MEMORY_1的缓冲区。

(NOLOAD)指令将标记在运行时未加载的节。链接器将正常处理该部分,但会标记它,以便程序加载程序不会将其加载到内存中。

这里我需要使用(NOLOAD)指令。描述的行为的解释是什么?如何使用NOLOAD而不将缓冲区移动到意外内存中?

EDIT2: ld文件看起来如下(根据Matthias的建议):

代码语言:javascript
复制
_gBuffer_1 = address(MEMORY_1),
_gBuffer_2 = address(MEMORY_1) + _gBuffer_1_size,
_gbuffer_3 = address(MEMORY_1) + _gBuffer_1_size + _gBuffer_2_size.......

_gBuffer_i_size必须在ld文件中定义。我的代码和很多部分中都有很多这样的缓冲区。现在,每当有人希望添加新缓冲区或更改现有缓冲区时(删除缓冲区或更改缓冲区大小.)他必须检查ld文件并重新计算地址,这就是为什么我发现建议的方法不太容易维护。最初的方法允许定义缓冲区,很容易地在程序员希望的每一节中找到它,并将剩下的工作留给添加linker.The指令后引起的(NOLOAD)问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-04 10:18:45

我们只是遇到了同样的问题。我们的工作是增加一个额外的间接层:

代码语言:javascript
复制
.my_section_noload ALIGN(32) (NOLOAD) :
{
  *(.my_section)
} > MEMORY_1

不知道为什么在直接使用它的时候,它是不工作的。

票数 1
EN

Stack Overflow用户

发布于 2018-02-14 08:25:23

你完全可以避免使用gcc属性。只需在链接器文件中提供符号:

代码语言:javascript
复制
_gBuffer = 0xB014D000;

然后可以将缓冲区声明为extern:

代码语言:javascript
复制
extern U32 gBuffer[size];

现在,链接器应该将extern声明绑定到给定的地址。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48764136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档