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: