În arhitectura modernă x86_64 pe sisteme de operare cu protecție ASLR (Address Space Layout Randomization), toate binarele și bibliotecile dinamice sunt compilate ca PIE (Position Independent Executable) sau PIC (Position Independent Code).
Pentru a atinge această independență față de locația din memorie unde nucleul încarcă programul, procesorul folosește registrul RIP (Instruction Pointer) ca bază pentru calculul adresei variabilelor de date.
Adresare Absolută (Învechită) vs RIP-Relative Addressing (Modernă)
; Activăm modul relativ implicit pentru întregul fișier sursă NASM:
default rel
section .rodata
titlu: db "Compilare PIE Sigură", 0
section .text
global obtine_adresa
obtine_adresa:
; MOD MODERN (RIP-Relative):
; Procesorul calculează adresa la rulare ca: RIP + diferență_octeți.
; Nu necesită relocări dinamice la pornirea programului!
lea rdi, [titlu] ; Instrucțiunea generată în binar este: lea rdi, [rip + 0x1234]
; Fără 'default rel', ar trebui specificat explicit cuvântul cheie 'rel':
; lea rdi, [rel titlu]
ret
De ce este obligatoriu PIE în Linux și macOS? Fără adresare RIP-relative, linker-ul modern (
ld / gcc) va refuza generarea executabilului cu eroarea: „relocation R_X86_64_32S against symbol can not be used when making a PIE object; recompile with -fPIE”.
Întrebări & Exemple de Cod:
Adresare Relativă la Pointerul de Instrucțiune: RIP-Relative Addressing în x86_64Ai o nelămurire despre utilizarea comenzii
Adresare Relativă la Pointerul de Instrucțiune: RIP-Relative Addressing în x86_64sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.