Biblioteki dynamiczne
Biblioteki dynamiczne

Biblioteka jest ładowana do raz pamięci i może być współdzielona pomiędzy różne procesy. Segment danych globalnych jest powielany dla każdego procesu.

Jest mapowana w pamięci pod różnymi adresami dla różnych procesów.

Potrzebny jest kod który będzie działał niezależnie gdzie się znajduje.

GOT i PLT

GOT i PLT

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

Wywołanie funkcji zewnętrznej

Odwołania do funkcji zewnętrznych odbywa się przy pomocy procedure linkage table (PLT)

 CALL printf WRT ..plt


Tomasz Kapela, Kraków 2011-2020