我正在尝试为自定义操作系统编译应用程序我正在为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段在这个奇怪的位置,给定我的链接器脚本?
答案 0 :(得分:0)
以后这可能与其他人有关:
问题在于我的链接过程。为了使它工作,我不得不使用-c标志编译我的应用程序,以获得正确的输出文件。然后链接到gcc的输出。我试图在一个步骤中进行编译和链接,并且当完成时出现了一些错误。