2016-02-12 46 views
1

我写了这个小引导程序,但是当我链接它,我得到这个错误:我不明白为什么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 
+2

'ld'想链接64位代码。尝试添加'-melf_i386'选项。 – Jester

+1

也惊讶'code16'工程。通常你需要像'.code16'这样的一段时间。即使在与Jester的更改成功链接后,您的代码也不会像您期望的那样运行。 –

+1

我强烈建议如果您在GNU汇编程序中执行bootloader,为了简单起见,您可以在最后一段代码之后和.byte 0x55 .byte之前删除'data'部分并将数据放入'.text'部分0xaa'。 '。= _ start + 510'没有做你认为的事。既然你在链接器'-Ttext 0x7c00'上有这个,'_start'的值将是0x7c00而不是0x0000。 '。= _ start + 510'会将位置计数器设置为0x7c00 + 510,这不是你想要的。试试这个,而不是'.space 510 - (。-_start)' –

回答

0

您需要更好地了解bootloader的开发。尽管你得到了一个链接器错误,即使你设法创建引导程序并将其放入软盘映像中,它也不会按预期运行。你可以在你的答案中看到我的评论中的一些问题。

因为你的问题就是关于连接错误,我会做出基于该错误消息,并得到一个受过教育的猜测,你还装配有类似:

as boot.s -o boot.o 

的名字你程序集文件可能不同,但汇编程序命令将会类似。


我不知道这只是当你复制你的代码的StackOverflow推出一个错字,但此行以你的引导代码的顶部:

code16 

应该是:

.code16 

此错误表明您正在开发64位环境:

boot.o: nella funzione "_start": 
(.text+0xa): rilocazione adattata per troncamento: R_X86_64_16 contro ".data" 

当使用GNU汇编器和GNU链接器时,您需要将16位引导加载程序代码组装到32位对象中,并且还需要链接为32位代码。在64位开发环境中ASLD通常默认为生成64位对象和可执行文件,而不是32位,这是您问题的原因。

命令像这样可能会解决您的链接错误:

as --32 boot.s -o boot.o 
ld -melf_i386 -Ttext 0x7c00 --oformat=binary boot.o -o boot.bin 

第一个命令汇编为使用--32选择32位ELF对象。第二个链接为32位,使用-melf_i386选项。这应该可以消除你的错误。

相关问题