无法在函数外部初始化全局变量

时间:2019-06-03 17:11:02

标签: c variables gcc

我有以下代码:

char* vidmem = (char*)0xb8000;

int main()
{
    vidmem[0] = 'x';
}

但这就像vidmem未初始化一样。相反,如果我做这样的事情:

char* vidmem;

int main()
{
    vidmem = (char*)0xb8000;

    vidmem[0] = 'x';
}

这很好用。为什么?

我使用以下代码进行编译和链接:

gcc -c main.c -o main.o -ffreestanding -fno-exceptions -m64
gcc -m64 -Wl,--build-id=none -static -nostdlib -nodefaultlibs -lgcc main.obj [...] -T linker.ld -o out.bin

使用此链接器文件:

ENTRY(_start)

SECTIONS
{
    . = 0x7C00;

    .bss :
    {
        *(.bss);
    }

    .text :
    {
        *(.text);
    }
}

实际上有一些汇编代码调用此C文件,但这无关紧要。我在gcc上做错什么了吗?我该如何解决?

2 个答案:

答案 0 :(得分:1)

您尚未将datarodata部分放在链接描述文件中。检查main.o文件中vidmem所在的部分,并确保在脚本中正确设置了该部分。

答案 1 :(得分:0)

不仅需要链接文件中的各个部分,而且还需要用于复制数据的初始化代码。

在链接的脚本中,您还需要显示此处以放置数据,并将RO存储器中的值存储在此处(在右括号之后