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]
lea eax,[ebx+extvar wrt ..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