c - GCC (NOLOAD)-指令导致错误的内存映射

标签 c gcc memory attributes ld

我正在使用 GCC(MIPS)。 以下是我的 .ld 文件中的相关部分。

MEMORY
{
   MEMORY_1                : ORIGIN = 0xB014D000,          N
   ....
   MEMORY_N                : ORIGIN = 0x9C00C800,          LENGTH = X*K
}
SECTIONS
{
   ....
 .my_section  ALIGN(32)           (NOLOAD)  : { } > MEMORY_1
   ....
}

代码处定义全局缓冲区:

static U32 __attribute__((section(".my_section"))) gBuffer[size];

我希望 gBuffer[] 地址在 MEMORY_1,然而,它的地址是 0x9c0***** 即在 MEMORY_N。 为什么?我该如何解决?

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

The (NOLOAD) directive will mark a section to not be loaded at run time. The linker will process the section normally, but will mark it so that a program loader will not load it into memory.

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

编辑 2: ld 文件将如下所示(根据 Matthias 的建议):

_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 文件并重新计算地址,这就是为什么我发现建议的方法不太容易维护. 最初的方法允许定义缓冲区,很容易将其定位在程序员希望的每个部分,并将其余工作留给链接器。添加 (NOLOAD) 指令后出现的问题。

最佳答案

我们刚刚遇到了同样的问题。我们的解决方法是添加一个额外的间接层:

.my_section_noload ALIGN(32) (NOLOAD) :
{
  *(.my_section)
} > MEMORY_1

不知道为什么直接使用它却不起作用。

关于c - GCC (NOLOAD)-指令导致错误的内存映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48764136/

相关文章:

当 valgrind 说没有内存泄漏时,内存泄漏的可能性

c - scanf 之后 fgets 不起作用

c++ - <random> 在 Linux 中生成相同的数字,但在 Windows 中不生成

python - 什么是使用交换。 python 版本

c - 是使用任何未定义的不确定值还是仅使用存储在具有自动存储的对象中的值?

c - automake 的 subdir-objects 选项不起作用

linux - 缓冲区在 64 位上溢出

c++ - 理解 GCC 中的 std::pow 实现

c - fread 缓冲区大小 - 我有大量内存,为什么不把它设置得很大呢?

android - 使用内存分析器追踪内存泄漏 - 带有美元符号的多个 Activity