Il formato del file oggetto Mach-O utilizzato da Mac OS X per eseguibili e librerie distingue tra librerie condivise e moduli caricati dinamicamente . Utilizzare otool -hv some_fileper vedere il tipo di file di some_file.
Le librerie condivise di Mach-O hanno il tipo di file MH_DYLIBe portano l'estensione .dylib. Possono essere collegati con i normali flag di linker statici, ad esempio -lfooper libfoo.dylib. Possono essere creati passando la -dynamiclibbandiera al compilatore. ( -fPICè il valore predefinito e non è necessario specificarlo.)
I moduli caricabili sono chiamati "bundle" in Mach-O speak. Hanno il tipo di file MH_BUNDLE. Possono trasportare qualsiasi estensione; l'estensione .bundleè consigliata da Apple, ma la maggior parte dei software portati utilizza .soper motivi di compatibilità. In genere, utilizzerai i bundle per i plug-in che estendono un'applicazione; in tali situazioni, il bundle si collegherà al file binario dell'applicazione per ottenere l'accesso all'API esportata dell'applicazione. Possono essere creati passando la -bundlebandiera al compilatore.
Entrambi dylibs e fasci possono essere caricati dinamicamente utilizzando le dlAPI (ad esempio dlopen, dlclose). Non è possibile collegarsi a pacchetti come se fossero librerie condivise. Tuttavia, è possibile che un bundle sia collegato a librerie condivise reali; quelli verranno caricati automaticamente quando il pacchetto viene caricato.
Storicamente, le differenze erano più significative. In Mac OS X 10.0, non c'era modo di caricare dinamicamente le librerie. Un set di API dyld (ad es NSCreateObjectFileImageFromFile. NSLinkModule) Sono state introdotte con 10.1 per caricare e scaricare bundle, ma non hanno funzionato per i dylibs. Una dlopenlibreria di compatibilità che ha funzionato con i bundle è stata aggiunta in 10.3; in 10.4, è dlopenstato riscritto come parte nativa di dyld e ha aggiunto il supporto per il caricamento (ma non lo scaricamento) di dylibs. Infine, 10.5 ha aggiunto il supporto per l'utilizzo dlclosecon dylibs e ha deprecato le API dyld.
Su sistemi ELF come Linux, entrambi usano lo stesso formato di file ; qualsiasi parte di codice condiviso può essere utilizzata come libreria e per il caricamento dinamico.
Infine, tieni presente che in Mac OS X, "bundle" può anche fare riferimento a directory con una struttura standardizzata che contiene il codice eseguibile e le risorse utilizzate da quel codice. Vi è una sovrapposizione concettuale (in particolare con "bundle caricabili" come plug-in, che generalmente contengono codice eseguibile sotto forma di un bundle Mach-O), ma non dovrebbero essere confusi con i bundle Mach-O discussi sopra.
Riferimenti aggiuntivi: