2016-02-12 4 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' 

Моя команда линкер:

ld -Ttext 0x7c00 --oformat=binary boot.o -o boot.bin 

Мой загрузчик код, написанный на GNU ассемблер:

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, что для простоты вы удаляете раздел 'data' и помещаете свои данные в раздел' .text' после последнего фрагмента кода и перед '.byte 0x55 .byte 0xaa'. '. = _ start + 510' не делает то, что вы думаете.Поскольку у вас есть это на компоновщике '-Ttext 0x7c00',' _start' будет иметь значение 0x7c00, а не 0x0000. '. = _ start + 510' установит счетчик местоположений на 0x7c00 + 510, который вам не нужен. Попробуйте это вместо '.space 510 - (.-_ Start)' –

ответ

0

Вам нужно лучше понять разработку загрузчика. Хотя вы получаете ошибку компоновщика, даже если вам удастся создать загрузчик и поместить его на дискету, он не будет работать, как ожидалось. Вы можете увидеть мои комментарии под своим ответом по некоторым вопросам.

Поскольку ваш вопрос просто об ошибке компоновщика, я собираюсь сделать обоснованное предположение основано на сообщении об ошибке вы все-таки, что вы собрались что-то вроде:

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 Assembler и GNU Linker вам необходимо собрать свой 16-разрядный код загрузчика для 32-битных объектов, а также ссылку как 32-разрядный код. В 64-разрядной среде разработки AS и LD обычно по умолчанию генерирует 64-битные объекты и исполняемые файлы, а не 32-разрядные, что является причиной ваших проблем.

Команды, как это, вероятно, решить вашу ошибку компоновщика:

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

Первая команда монтирует в 32-битном ELF объекта с помощью опции --32. Второе звено - 32-битное, с использованием опции -melf_i386. Это должно устранить вашу ошибку.

Смежные вопросы