Das von Mac OS X für ausführbare Dateien und Bibliotheken verwendete Mach-O-Objektdateiformat unterscheidet zwischen gemeinsam genutzten Bibliotheken und dynamisch geladenen Modulen . Verwenden otool -hv some_file
Sie diese Option, um den Dateityp von anzuzeigen some_file
.
Gemeinsame Mach-O-Bibliotheken haben den Dateityp MH_DYLIB
und tragen die Erweiterung .dylib. Sie können mit den üblichen statischen Linker-Flags verknüpft werden, z -lfoo
. B. für libfoo.dylib. Sie können erstellt werden, indem das -dynamiclib
Flag an den Compiler übergeben wird. ( -fPIC
ist die Standardeinstellung und muss nicht angegeben werden.)
Ladefähige Module werden in Mach-O-Sprache als "Bundles" bezeichnet. Sie haben den Dateityp MH_BUNDLE
. Sie können jede Verlängerung tragen; Die Erweiterung .bundle
wird von Apple empfohlen, die meisten portierten Programme werden jedoch .so
aus Kompatibilitätsgründen verwendet. In der Regel verwenden Sie Bundles für Plug-Ins , die eine Anwendung erweitern. In solchen Situationen wird das Bundle mit der Anwendungsbinärdatei verknüpft, um Zugriff auf die exportierte API der Anwendung zu erhalten. Sie können erstellt werden, indem das -bundle
Flag an den Compiler übergeben wird.
Beide dylibs und Bündel können dynamisch die Verwendung geladen werden dl
APIs (z dlopen
, dlclose
). Es ist nicht möglich, eine Verknüpfung mit Bundles herzustellen, als wären sie gemeinsam genutzte Bibliotheken. Es ist jedoch möglich, dass ein Bundle mit echten gemeinsam genutzten Bibliotheken verknüpft ist. Diese werden automatisch geladen, wenn das Bundle geladen wird.
Historisch gesehen waren die Unterschiede signifikanter. In Mac OS X 10.0 gab es keine Möglichkeit, Bibliotheken dynamisch zu laden. Ein Satz von APIs dyld (z NSCreateObjectFileImageFromFile
, NSLinkModule
) wurde mit 10.1 zum Laden und Entladen Bündel eingeführt, aber sie haben nicht die Arbeit für dylibs. Eine dlopen
Kompatibilitätsbibliothek, die mit Bundles funktioniert, wurde in 10.3 hinzugefügt. in 10.4 dlopen
wurde umgeschrieben, um ein nativer Teil von dyld zu sein, und Unterstützung für das Laden (aber nicht das Entladen) von Dylibs hinzugefügt. Schließlich fügte 10.5 Unterstützung für die Verwendung dlclose
mit Dylibs hinzu und veraltete die dyld-APIs.
Auf ELF-Systemen wie Linux verwenden beide dasselbe Dateiformat . Jeder gemeinsam genutzte Code kann als Bibliothek und zum dynamischen Laden verwendet werden.
Beachten Sie schließlich, dass "Bundle" in Mac OS X auch auf Verzeichnisse mit einer standardisierten Struktur verweisen kann , die ausführbaren Code und die von diesem Code verwendeten Ressourcen enthält. Es gibt einige konzeptionelle Überschneidungen (insbesondere bei "ladbaren Bundles" wie Plugins, die im Allgemeinen ausführbaren Code in Form eines Mach-O-Bundles enthalten), sie sollten jedoch nicht mit den oben diskutierten Mach-O-Bundles verwechselt werden.
Zusätzliche Referenzen: