【发布时间】:2018-07-23 15:58:21
【问题描述】:
我正在使用 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[]address 是MEMORY_1,但是,它的地址是0x9c0*****,即MEMORY_N。
为什么?我该如何解决?
编辑:
我发现删除NOLOAD 指令后,缓冲区位于MEMORY_1。
(NOLOAD) 指令将标记一个在运行时不加载的部分。链接器将正常处理该部分,但会对其进行标记,以便程序加载器不会将其加载到内存中。
我需要在这里使用 (NOLOAD) 指令。所描述行为的解释是什么? 如何在不将缓冲区移动到意外内存的情况下使用 NOLOAD?
EDIT2: 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) 指令后引发的问题。
【问题讨论】:
-
反转地址?
-
您是否在部分声明周围添加了
SECTION{...}? -
@Matthias,是的,我做到了。
-
有时,链接器对语法有点过于敏感。你试过
>MEMORY_1(即没有空格)吗? -
@Matthias。试过了,没用……
标签: c gcc memory attributes ld