Gnu 为什么gcc将我的全局数据放在错误的地址?
我正在尝试为一个定制操作系统编译一个应用程序,我正在为ARM Cortex M0+编写。应用程序是用C编写的。我有一个全局变量,int newInt=4;在我的代码的最顶端定义。应用程序的其余部分只调用一个print函数来打印该变量的值。然而,它不断地崩溃。为了检查它,我打印了变量newInt的地址。它远远超出了芯片的有效内存映射,因此它崩溃了 我的链接器脚本很简单:Gnu 为什么gcc将我的全局数据放在错误的地址?,gnu,Gnu,我正在尝试为一个定制操作系统编译一个应用程序,我正在为ARM Cortex M0+编写。应用程序是用C编写的。我有一个全局变量,int newInt=4;在我的代码的最顶端定义。应用程序的其余部分只调用一个print函数来打印该变量的值。然而,它不断地崩溃。为了检查它,我打印了变量newInt的地址。它远远超出了芯片的有效内存映射,因此它崩溃了 我的链接器脚本很简单: SECTIONS { . = 0x20001580; .text : { _text
SECTIONS
{
. = 0x20001580;
.text :
{
_text = .;
*(.text)
_etext = .;
}
.data :
{
_data = .;
KEEP(*(.data))
_edata = .;
}
.bss :
{
_bss = .;
*(.bss)
_ebss = .;
}
}
现在,.text段已正确放置,从0x20001580开始。然而,我的全局变量的地址,应该在该值附近(0x20001580左右,加上大约40字节的代码大小),实际上被放置在0x18060,就我而言,这是一个完全随机的地址。因此,每当我尝试访问newInt的值时,代码都会尝试访问超出范围的内存地址,但它失败了
newInt不应该放在.data段中吗?如果是这样的话,考虑到我的链接器脚本,.data段为什么会位于如此奇怪的位置?这可能与以后的其他人有关: 问题在于我的链接过程。为了让它工作,我必须使用-c标志编译我的应用程序,以获得正确的输出文件。然后根据gcc的输出进行链接。我试图一步完成编译和链接,但完成后出现了一些问题