Gnu 为什么gcc将我的全局数据放在错误的地址?

Gnu 为什么gcc将我的全局数据放在错误的地址?,gnu,Gnu,我正在尝试为一个定制操作系统编译一个应用程序,我正在为ARM Cortex M0+编写。应用程序是用C编写的。我有一个全局变量,int newInt=4;在我的代码的最顶端定义。应用程序的其余部分只调用一个print函数来打印该变量的值。然而,它不断地崩溃。为了检查它,我打印了变量newInt的地址。它远远超出了芯片的有效内存映射,因此它崩溃了 我的链接器脚本很简单: SECTIONS { . = 0x20001580; .text : { _text

我正在尝试为一个定制操作系统编译一个应用程序,我正在为ARM Cortex M0+编写。应用程序是用C编写的。我有一个全局变量,int newInt=4;在我的代码的最顶端定义。应用程序的其余部分只调用一个print函数来打印该变量的值。然而,它不断地崩溃。为了检查它,我打印了变量newInt的地址。它远远超出了芯片的有效内存映射,因此它崩溃了

我的链接器脚本很简单:

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的输出进行链接。我试图一步完成编译和链接,但完成后出现了一些问题