Myślisz, że zarabiasz tyle, na ile zasługujesz? Zapraszamy do wzięcia udziału w anonimowej ankiecie.
2

Jezeli mamy zwyklego liba, to sprawa jest prosta i taka sama na systemie linux oraz windows: funkcje sa na zywca wklejane do programu i z glowy. Co sie dzieje podczas linkowania dynamicznego? Przeciez funkcja moze miec rozne polozenie? Podejrzewam, ze adres jest jakos wyliczany, ale czy nie jest to niewydajne?

flag

3 Answers

3

Tłumacząc na chłopski rozum: program ma na swoim końcu specjalną tablicę, w której trzymane są adresy wszystkich funkcji zewnętrznych, łącznie z bibliotekami do których się dany program odnosi (np. kernel32.dll - LoadLibraryEx). Podczas ładowania fizyczne adresy funkcji są wpisywane do tej tablicy. Niektóre wirusy, aby ukryć z których bibliotek korzystają i aby uniemożliwić dekompilacje tworzą tablicę podpisów funkcji (hash biblioteki i funkcji) i samodzielnie wykonują załączanie dynamicznie - przeglądając wszystkie biblioteki oraz funkcje.

Wydajnościowo kod statyczny jest szybszy, może podlegać optymalizacji podczas ogólnej optymalizacji programu. Kod dynamicznie łączony jest wolniejszy, ale może być użyty wiele razy, wymieniony oraz łatwiej go aktualizować.

Zasada jest prosta: biblioteki powinny być dynamiczne.

link|flag
2

Oczywiście, że jest to niewydajne. Umożliwia jednak odseparowanie poszczególnych bibliotek i uniezależnienie się od tego gdzie leżą. Dynamiczne linkowanie jest zazwyczaj wykonywane po raz pierwszego uruchomienia programu w danej sesji (reset kompa niweluje działanie). Linker posiada coś w rodzaju katalogu bibliotek i na podstawie żądań przekazuje odpowiednie adresy. Można ten proces trochę ulepszyć, w linuxie masz narzędzie prelink. Przeczytaj proszę poradnik - jak przyspieszyć linuxa. Opisana metoda działa. Zobaczysz jaka jest różnica pomiędzy kodem dynamicznie linkowanym, a tym z prelinkim.

link|flag
2

W Windowsie nie ma różnicy w wydajności uruchamiania kodu łączonego dynamicznie, a statycznie. Jeśli jakieś DLL jest już załadowane w pamięci, korzystają z niego wszystkie programy. Jeśli linkujemy statycznie... No cóż - każdy posiada własną kopię tej biblioteki (pomyślmy o cache'u procesora).

Proponuję przeczytać: http://en.wikipedia.org/wiki/Dynamic-link_library#Symbol_resolution_and_binding

No, a jeśli ktoś ma jakieś wątpliwości co do wydajności i użyteczności dynamicznego linkowania, proponuję statycznie linkować do kernel32.dll i user32.dll ;)

link|flag

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.