To make my gdt(Global Descriptor Table) vaild,these days I have using assembly to write the segment registers when programming my bare metal.(In x86_64 architecture)
I have encountered the error like this:
procedure kernel_gdt_initialize;
var temprec:x64_gdt_descriptor;
label reloadcodesegment,reloadsegment;
begin
gdt.Offset:=Qword(@gdtentry);
gdt.Size:=sizeof(gdtentry)-1;
kernel_gdt_set_entry(1,0,0,$0,$0);
kernel_gdt_set_entry(2,0,$FFFFF,$9A,$A);
kernel_gdt_set_entry(3,0,$FFFFF,$92,$C);
kernel_gdt_set_entry(4,0,$FFFFF,$FA,$A);
kernel_gdt_set_entry(5,0,$FFFFF,$F2,$C);
temprec:=gdt;
asm
reloadsegment:
lgdtq temprec
push $8
lea reloadcodesegment,%rax //Where the error occurs.(The Error is Generating PIC, but reference is not PIC-safe)
push %rax
lretq
reloadcodesegment:
mov $16,%ax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
mov %ax,%gs
mov %ax,%ss
end;
end;
Does anyone have the idea about edit these code to pass the compiler?