Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC(NOLOAD)-指令导致错误的内存映射_C_Gcc_Memory_Attributes_Ld - Fatal编程技术网

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

GCC(NOLOAD)-指令导致错误的内存映射,c,gcc,memory,attributes,ld,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) : {

我与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\u 1
,但是,它的地址是
0x9c0******
,即位于
MEMORY\u N
。 为什么?我怎样才能修好它

编辑: 我发现在删除
NOLOAD
指令后,位于
MEMORY\u 1
的缓冲区被删除

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

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

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

_必须在ld文件中定义gBuffer_i_大小。 我的代码中有很多这样的缓冲区和很多部分。 现在,每当有人希望添加新的缓冲区或更改现有的缓冲区(删除它或更改其大小…)时,他必须遍历ld文件并重新计算地址,这就是为什么我发现建议的方法不太容易维护的原因。
最初的方法允许定义缓冲区,方便地在程序员希望的每个部分找到缓冲区,并将其余工作留给链接器。添加
(NOLOAD)
指令后出现的问题。

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

_gBuffer = 0xB014D000;
然后可以将缓冲区声明为extern:

extern U32 gBuffer[size];

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

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

_gBuffer = 0xB014D000;
然后可以将缓冲区声明为extern:

extern U32 gBuffer[size];

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

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

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

不知道为什么直接使用它会起作用。我们遇到了同样的问题。我们的解决方案是增加一个额外的间接层:

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


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

颠倒地址?你是否在你的节声明周围放了一个
节{
..
}
?@Matthias,是的。有时候,链接器对语法有点过于敏感。你有没有试过记忆(即没有空间)?@Matthias。尝试过,没有帮助…反转地址?你是否在分区声明周围放置了一个
分区{
..
}
?@Matthias,是的,我这样做了。有时,链接器对语法有点过于敏感。你有没有试过记忆(即没有空间)?@Matthias。试过了,没用…谢谢你的回答。是否有其他更易于维护的方法来实现相同的目标?我有很多缓冲区和很多分区。谢谢。我不明白。为什么这种方法比原来的方法更难维护?@Matthis,你可以在最初的帖子的EDIT2上找到我的答案,谢谢。谢谢你的回答。是否有其他更易于维护的方法来实现相同的目标?我有很多缓冲区和很多分区。谢谢。我不明白。为什么这种方法比原来的方法更难维护?@Matthis,你可以在原始帖子的EDIT2中找到我的答案,谢谢..我的_部分是一个输入部分,在本例中取自多个.o文件(即“*”位)。另一方面,“.my_section_noload”是一个输出节,由链接器在整理输入数据时生成。输出具有类似的名称以避免混淆。理论上,你可以称之为“幸福”,但调试器可能有一项工作来理解你的意思。。。。。。。我所说的“类似”并不是指“完全”。如果您在gcc中使用-ffunction节生成函数节,那么您将有许多.text节(.text.main、.text.function1、.text.init等)。这些将被指定为带有
*(.text*)
的输入,并作为
.text
的输出。如果要求链接器进行垃圾收集,它将丢弃未引用的输入节。.my_节是一个输入节,在本例中取自多个.o文件(即“*”位)。另一方面,“.my_section_noload”是一个输出节,由链接器在整理输入数据时生成。输出具有类似的名称以避免混淆。理论上,你可以称之为“幸福”,但调试器可能有一项工作来理解你的意思。。。。。。。我所说的“类似”并不是指“完全”。如果您在gcc中使用-ffunction节生成函数节,那么您将有许多.text节(.text.main、.text.function1、.text.init等)。这些将被指定为带有
*(.text*)
的输入,并作为
.text
的输出。如果要求链接器进行垃圾收集,它将丢弃未引用的输入部分。