【问题标题】:Can't initialize global variables outside functions无法在函数外初始化全局变量
【发布时间】:2019-06-03 17:11:02
【问题描述】:

我有这个代码:

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 上做错了吗?我该如何解决?

【问题讨论】:

  • 你为什么要问一个新问题? stackoverflow.com/questions/56430956/… 这个是一样的,没有正确的答案(即使你已经接受了一些解决方法),但是你有很多有价值的 cmets。原因可能在于您(缺少)用于复制数据段的启动代码。
  • @AjayBrahmakshatriya 这是一个问题的一半,但没有人回答正确的问题,所以我在这里问了第二个问题
  • 这就是问题的问题 - 它不完整。所以你必须完成它而不是发布另一个。此外,如果您对答案不满意 - 不接受

标签: c variables gcc


【解决方案1】:

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

【讨论】:

  • 为什么用赋值替换初始化会改变呢?
  • 不..我已经添加了数据和rodata,甚至一次只尝试了一个,但是这个解决方案都不起作用..
  • @Mimmo - 您的运行时是否正确重新定位数据部分?如果它包含在可执行文件中,它必须工作。
  • @Barmar - 因为它被初始化了?通常数据部分会在main 之前被重定位,但如果没有,将初始化放在那里至少会在编译器期望它所在的内存位置放置一些有用的东西。
  • 我实际上对这个环境有点陌生,我不知道..我该如何检查?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多