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_fileSie diese Option, um den Dateityp von anzuzeigen some_file.
Gemeinsame Mach-O-Bibliotheken haben den Dateityp MH_DYLIBund 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 -dynamiclibFlag an den Compiler übergeben wird. ( -fPICist 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 .bundlewird von Apple empfohlen, die meisten portierten Programme werden jedoch .soaus 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 -bundleFlag an den Compiler übergeben wird.
Beide dylibs und Bündel können dynamisch die Verwendung geladen werden dlAPIs (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 dlopenKompatibilitätsbibliothek, die mit Bundles funktioniert, wurde in 10.3 hinzugefügt. in 10.4 dlopenwurde 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 dlclosemit 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: