Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t初始化函数外部的全局变量_C_Variables_Gcc - Fatal编程技术网

Can';t初始化函数外部的全局变量

Can';t初始化函数外部的全局变量,c,variables,gcc,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 -

我有这个密码:

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做了什么错事吗?如何修复它?

您尚未在链接器脚本中放置
数据
rodata
部分。检查
main.o
文件中的
vidmem
节,并确保在脚本中正确设置该节。

不仅需要链接文件中的节,还需要复制数据的初始化代码


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

您为什么要问一个新问题?这个问题是相同的,并且没有正确的答案(即使您接受了一些解决方法),但你在那里得到了很多有价值的评论。原因可能在于你(缺乏)复制数据段的启动代码。@AjayBrahmakshatriya可能重复,这是一个问题的一半,但没有人正确回答这个问题,因此我在这里问了第二个问题,这是问题的一半-它是不完整的。所以你必须完成它,而不是发布另一个。如果你对ans不满意的话wer-不接受它为什么用赋值替换初始化会改变它?不。我已经添加了数据和rodata,甚至一次只添加一个,但这两个解决方案都不起作用。@Mimmo-您的运行时是否正确地重新定位了数据部分?如果它包含在可执行文件中,它就必须工作。@Barmar-因为它会进入初始化?通常情况下,数据段会在
main
之前重新定位,但如果不重新定位,则将初始化放在那里至少会在编译器预期的内存位置中放置一些有用的内容。实际上,我对这个环境有点陌生,我不知道。如何检查?