我有这个密码:
char* vidmem = (char*)0xb8000;
int main()
{
vidmem[0] = 'x';
}
但这就像维德曼没有被初始化一样。如果我做了这样的事:
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文件,但这无关紧要。我对海合会有什么不好吗?我怎样才能修好它?
最佳答案
您尚未将data
或rodata
节放入链接器脚本中。检查main.o
文件中的vidmem
节,并确保在脚本中正确设置了该节。