я написал этот маленький загрузчик, но когда я связываю это я получаю эту ошибку:я не могу понять, почему 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
'ld' хочет связать 64-битный код. Попробуйте добавить опцию '-melf_i386'. – Jester
Также удивлен 'code16' работает. Обычно вам нужен период впереди, как '.code16'. Даже после успешной связи с изменением Jester ваш код не будет работать так, как вы ожидаете, когда он запустится. –
Я очень рекомендую, если вы выполняете загрузчик на ассемблере GNU, что для простоты вы удаляете раздел 'data' и помещаете свои данные в раздел' .text' после последнего фрагмента кода и перед '.byte 0x55 .byte 0xaa'. '. = _ start + 510' не делает то, что вы думаете.Поскольку у вас есть это на компоновщике '-Ttext 0x7c00',' _start' будет иметь значение 0x7c00, а не 0x0000. '. = _ start + 510' установит счетчик местоположений на 0x7c00 + 510, который вам не нужен. Попробуйте это вместо '.space 510 - (.-_ Start)' –