В GAS, поскольку определение вашего GDT появляется после jmp $gdtcode, $_start
, ассемблер увидит JMP и будет считать, что символ gdtcode
является внешним символом (который будет перемещен компоновщиком)а не константа.Из-за этого он будет жаловаться на не абсолютные ссылки.
Вы также неправильно определяете свой GDT, поставив .word .- gdt
после gdtcode:
и gdtdata
.Эти строки будут передавать 16-битное слово в GDT, где вы не хотите их.
Я полагаю, вы, возможно, пытались что-то вроде следующего.GDT определяется в некоторой точке до JMP :
gdt:
.quad 0x0000000000000000
gdtcode:
.quad 0x0020980000000000
gdtdata:
.quad 0x0000900000000000
gdtpointer:
.word .-gdt-1
.quad gdt
CODE64_SEL = gdtcode-gdt
DATA64_SEL = gdtdata-gdt
И затем на более позднем этапе в файле вы можете использовать FAR JMP вот так:
jmp $CODE64_SEL, $_start