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_file
per vedere il tipo di file di some_file
.
Le librerie condivise di Mach-O hanno il tipo di file MH_DYLIB
e portano l'estensione .dylib. Possono essere collegati con i normali flag di linker statici, ad esempio -lfoo
per libfoo.dylib. Possono essere creati passando la -dynamiclib
bandiera 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 .so
per 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 -bundle
bandiera al compilatore.
Entrambi dylibs e fasci possono essere caricati dinamicamente utilizzando le dl
API (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 dlopen
libreria di compatibilità che ha funzionato con i bundle è stata aggiunta in 10.3; in 10.4, è dlopen
stato 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 dlclose
con 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: