我有以下代码:
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上做错什么了吗?我该如何解决?
答案 0 :(得分:1)
您尚未将data
或rodata
部分放在链接描述文件中。检查main.o
文件中vidmem
所在的部分,并确保在脚本中正确设置了该部分。
答案 1 :(得分:0)
不仅需要链接文件中的各个部分,而且还需要用于复制数据的初始化代码。
在链接的脚本中,您还需要显示此处以放置数据,并将RO存储器中的值存储在此处(在右括号之后