无法在gcc中使用全局变量

时间:2019-06-03 16:06:48

标签: c gcc

我有一个像这样的文件:

4, 5, 6 ,7

但是当我用gcc编译时,它的行为就像vidmem甚至不存在。我在函数外部声明的所有变量都有此问题。 Maby可以在main内部声明此变量,但不能在链接到此文件的其他文件中声明其他变量。 这是我的编译方式:

char* vidmem = (char*)0xb8000;

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

这就是我组装所有文件的方式:

gcc -c main.c -o main.obj -ffreestanding -fno-exceptions -m64

为什么会这样?而我该如何解决呢?

编辑:

我正在制作一个操作系统,这是来自C内核的代码。我正在使用Windows的Linux子系统对其进行编译,并使用qemu进行了测试

以下是所有代码的链接:http://www.mediafire.com/file/7x21lh4dnc93dz9/OS.7z/file

2 个答案:

答案 0 :(得分:1)

您可以声明全局变量,但必须像这样在main内部进行初始化: char * vidmem;

char* vidmem;

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

    vidmem[0] = 'x';
    vidmem[1] = 0x0f;
}

答案 1 :(得分:-1)

我不明白为什么这个问题有很多反对票。这是一个完全有效和有趣的问题,我在1小时前遇到了同样的问题。

问题是,例如,在正常情况下,链接器生成在Linux上运行的可执行文件时,全局变量存储在.data节中,并且它们的值是可执行文件的一部分。现在,在您的方案中,您将生成原始二进制数据并直接将其引导。在这种情况下,您需要向链接器指定全局变量应在映像中存储的位置。例如,您可以通过-Tdata 0x6000进行存储,以从地址0x6000开始存储它们。然后,在加载操作系统时,请确保在访问全局变量之前将映像的这一部分加载到内存中。