Biblioteki dynamiczne
Tryb 32 bitowy

mov eax,[zmienna]   ; BŁĄD!!! 

Zmienne nie są pod stałymi adresami, są w pamięci zwanej Global Offset table (GOT), która jest usytuowana w stałej odległości od kodu biblioteki współdzielonej.

Aby uzyskać adres absolutny GOT wykonujemy

extern  _GLOBAL_OFFSET_TABLE_ 
func:   push    ebp 
        mov     ebp,esp 
        push    ebx 
        call    .get_GOT 
.get_GOT: 
        pop     ebx 
        add     ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc 
 
        ; the function body comes here 
 
        mov     ebx,[ebp-4] 
        mov     esp,ebp 
        pop     ebp 
        ret

lea     eax,[ebx+myvar wrt ..gotoff]

myvar wrt ..gotoff oblicza offset zmiennej lokalnej myvar od początku GOT

lea     eax,[ebx+extvar wrt ..got]

myvar wrt ..gotoff oblicza offset zmiennejzewnętrznej extvar od początku GOT

W trybie 64 bitowym jeżeli zmienna znajduje się w nie dalej niż +/- 2GB można użyć adresowania relatywnego do RIP

lea     rax,[rel myvar]
 
mov [rel myvar], rbx


Tomasz Kapela, Kraków 2011-2020