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

时间:2017-02-13 17:40:55

标签: gnu

我正在尝试为自定义操作系统编译应用程序我正在为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段在这个奇怪的位置,给定我的链接器脚本?

1 个答案:

答案 0 :(得分:0)

以后这可能与其他人有关:

问题在于我的链接过程。为了使它工作,我不得不使用-c标志编译我的应用程序,以获得正确的输出文件。然后链接到gcc的输出。我试图在一个步骤中进行编译和链接,并且当完成时出现了一些错误。