Format plików obiektowych Mach-O używany przez Mac OS X w plikach wykonywalnych i bibliotekach rozróżnia biblioteki współdzielone i moduły ładowane dynamicznie . Użyj, otool -hv some_file
aby zobaczyć typ pliku some_file
.
Biblioteki współdzielone Mach-O mają typ pliku MH_DYLIB
i mają rozszerzenie .dylib. Można je połączyć ze zwykłymi statycznymi flagami linkera, np. -lfoo
Dla libfoo.dylib. Można je utworzyć, przekazując -dynamiclib
flagę do kompilatora. ( -fPIC
jest ustawieniem domyślnym i nie trzeba go określać).
Moduły ładowalne nazywane są „pakietami” w mowie Mach-O. Mają typ pliku MH_BUNDLE
. Mogą nosić dowolne przedłużenie; rozszerzenie .bundle
jest zalecane przez Apple, ale większość portowanych programów używa .so
ze względu na kompatybilność. Zazwyczaj używasz pakietów do wtyczek rozszerzających aplikację; w takich sytuacjach pakiet łączy się z plikiem binarnym aplikacji, aby uzyskać dostęp do eksportowanego interfejsu API aplikacji. Można je utworzyć, przekazując -bundle
flagę do kompilatora.
Oba dylibs i zestawy mogą być załadowane dynamicznie przy użyciu dl
API (np dlopen
, dlclose
). Nie można połączyć się z pakietami tak, jakby były bibliotekami współdzielonymi. Możliwe jest jednak, że pakiet jest połączony z prawdziwymi bibliotekami współdzielonymi; zostaną one załadowane automatycznie po załadowaniu pakietu.
Historycznie różnice były bardziej znaczące. W Mac OS X 10.0 nie było możliwości dynamicznego ładowania bibliotek. Zestaw API dyld (na przykład NSCreateObjectFileImageFromFile
, NSLinkModule
) wprowadzono 10,1 do wkładania i wyjmowania pakietów, ale nie dla dylibs. dlopen
Biblioteki zgodność, że współpracuje z wiązek dodano 10,3; w 10.4 dlopen
został przepisany na natywną część dyld i dodano obsługę ładowania (ale nie rozładowywania) dylibs. Wreszcie, 10.5 dodało obsługę używania dlclose
z dylibs i przestało działać różne interfejsy API.
W systemach ELF, takich jak Linux, oba używają tego samego formatu pliku ; dowolny fragment współdzielonego kodu może być wykorzystywany jako biblioteka i do dynamicznego ładowania.
Na koniec należy pamiętać, że w systemie Mac OS X „pakiet” może również odnosić się do katalogów o ustandaryzowanej strukturze, która zawiera kod wykonywalny i zasoby używane przez ten kod. Istnieje pewne koncepcyjne nakładanie się (szczególnie w przypadku „pakietów ładowalnych”, takich jak wtyczki, które zazwyczaj zawierają kod wykonywalny w postaci pakietu Mach-O), ale nie należy ich mylić z omówionymi powyżej pakietami Mach-O.
Dodatkowe referencje:
-dynamiclib
jest flagą GCC. Powoduje to, że kompilator przechodzi-dylib
do ld.Plik .so nie jest rozszerzeniem UNIX dla biblioteki współużytkowanej.
To się po prostu zdarza.
Sprawdź wiersz 3b na stronie sharedlib ArnaudRecipes
Zasadniczo .dylib to rozszerzenie pliku mac używane do wskazania wspólnej biblioteki.
źródło
Różnica między plikami .dylib i .so w systemie Mac OS X polega na sposobie ich kompilacji. Dla plików .so używasz -shared, a dla .dylib używasz -dynamiclib. Zarówno .so, jak i .dylib są wymienne jako dynamiczne pliki bibliotek i albo mają typ DYLIB, albo BUNDLE. Oto odczyt różnych plików, które to pokazują.
Oba są równoważne w systemie Mac OS X ze względu na wsteczną kompatybilność z innymi programami systemu UNIX, które kompilują się do typu pliku .so.
Uwagi dotyczące kompilacji: niezależnie od tego, czy kompilujesz plik .so, czy plik .dylib, musisz wstawić poprawną ścieżkę do biblioteki dynamicznej podczas etapu łączenia. Robisz to, dodając -install_name i ścieżkę pliku do polecenia łączenia. Jeśli tego nie zrobisz, napotkasz problem widoczny w tym poście: Mac Dynamic Library Craziness (może być tylko Fortran) .
źródło
./configure
generować.dylib
pliki zamiast łączyć pliki.so
?./configure --enable-shared
nie wykonuje tego zadania.To tylko obserwacja, którą właśnie poczyniłem, budując naiwny kod w OSX za pomocą cmake:
tworzy pliki .so
podczas
tworzy pliki .dynlib .
Być może to pomaga każdemu.
źródło