我写了这个小引导程序,但是当我链接它,我得到这个错误:我不明白为什么LD给出rilocazione(搬迁)错误
boot.o: nella funzione "_start":
(.text+0xa): rilocazione adattata per troncamento: R_X86_64_16 contro ".data"
在英语中,错误的是:
boot.o: In function `_start':
(.text+0xa): relocation truncated to fit: R_X86_64_16 against `.data'
我的链接器命令是:写在GNU汇编
ld -Ttext 0x7c00 --oformat=binary boot.o -o boot.bin
我的Bootloader代码是:
code16
.data
prova: .string "questa è una prova"
.text
.globl _start
_start:
//now i try to print on the screen a string
//for do that i'm gonna to use int 0x10
mov $0x13,%ah
mov $0x0,%bh
mov $0x01,%bl
mov $20,%cx
push $[prova]
pop %es
int $0x10
jmp boot
boot:
.=_start+510
.byte 0x55
.byte 0xaa
'ld'想链接64位代码。尝试添加'-melf_i386'选项。 – Jester
也惊讶'code16'工程。通常你需要像'.code16'这样的一段时间。即使在与Jester的更改成功链接后,您的代码也不会像您期望的那样运行。 –
我强烈建议如果您在GNU汇编程序中执行bootloader,为了简单起见,您可以在最后一段代码之后和.byte 0x55 .byte之前删除'data'部分并将数据放入'.text'部分0xaa'。 '。= _ start + 510'没有做你认为的事。既然你在链接器'-Ttext 0x7c00'上有这个,'_start'的值将是0x7c00而不是0x0000。 '。= _ start + 510'会将位置计数器设置为0x7c00 + 510,这不是你想要的。试试这个,而不是'.space 510 - (。-_start)' –