Recent

Author Topic: ERROR:Generating PIC, but reference is not PIC-safe when using assembly  (Read 308 times)

TYDQ

  • Full Member
  • ***
  • Posts: 132
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:
Code: Pascal  [Select][+][-]
  1. procedure kernel_gdt_initialize;
  2. var temprec:x64_gdt_descriptor;
  3. label reloadcodesegment,reloadsegment;
  4. begin
  5.  gdt.Offset:=Qword(@gdtentry);
  6.  gdt.Size:=sizeof(gdtentry)-1;
  7.  kernel_gdt_set_entry(1,0,0,$0,$0);
  8.  kernel_gdt_set_entry(2,0,$FFFFF,$9A,$A);
  9.  kernel_gdt_set_entry(3,0,$FFFFF,$92,$C);
  10.  kernel_gdt_set_entry(4,0,$FFFFF,$FA,$A);
  11.  kernel_gdt_set_entry(5,0,$FFFFF,$F2,$C);
  12.  temprec:=gdt;
  13.  asm
  14.   reloadsegment:
  15.   lgdtq temprec
  16.   push $8
  17.   lea reloadcodesegment,%rax //Where the error occurs.(The Error is Generating PIC, but reference is not PIC-safe)
  18.   push %rax
  19.   lretq
  20.   reloadcodesegment:
  21.   mov $16,%ax
  22.   mov %ax,%ds
  23.   mov %ax,%es
  24.   mov %ax,%fs
  25.   mov %ax,%gs
  26.   mov %ax,%ss
  27.  end;
  28. end;
Does anyone have the idea about edit these code to pass the compiler?

Khrys

  • Full Member
  • ***
  • Posts: 229
You can use  RIP-relative addressing for local labels:

Code: ASM  [Select][+][-]
  1. lea reloadcodesegment(%rip), %rax

TYDQ

  • Full Member
  • ***
  • Posts: 132
You can use  RIP-relative addressing for local labels:

Code: ASM  [Select][+][-]
  1. lea reloadcodesegment(%rip), %rax
However,this is solved by not using setvalue to Segment register.

 

TinyPortal © 2005-2018