Le format de fichier objet Mach-O utilisé par Mac OS X pour les exécutables et les bibliothèques fait la distinction entre les bibliothèques partagées et les modules chargés dynamiquement . Utilisez otool -hv some_file
pour voir le type de fichier de some_file
.
Les bibliothèques partagées Mach-O ont le type de fichier MH_DYLIB
et portent l'extension .dylib. Ils peuvent être liés avec les indicateurs de l'éditeur de liens statiques habituels, par exemple -lfoo
pour libfoo.dylib. Ils peuvent être créés en passant l' -dynamiclib
indicateur au compilateur. ( -fPIC
est la valeur par défaut et n'a pas besoin d'être spécifiée.)
Les modules chargeables sont appelés "bundles" dans le langage Mach-O. Ils ont le type de fichier MH_BUNDLE
. Ils peuvent porter n'importe quelle extension; l'extension .bundle
est recommandée par Apple, mais la plupart des logiciels portés sont utilisés .so
pour des raisons de compatibilité. En règle générale, vous utiliserez des ensembles de plug-ins qui étendent une application; dans de telles situations, le bundle sera lié au binaire de l'application pour accéder à l'API exportée de l'application. Ils peuvent être créés en passant l' -bundle
indicateur au compilateur.
Les dylibs et les bundles peuvent être chargés dynamiquement à l'aide des dl
API (par exemple dlopen
, dlclose
). Il n'est pas possible de se lier à des bundles comme s'ils étaient des bibliothèques partagées. Cependant, il est possible qu'un bundle soit lié à de vraies bibliothèques partagées; ceux-ci seront chargés automatiquement lorsque le bundle est chargé.
Historiquement, les différences étaient plus importantes. Dans Mac OS X 10.0, il n'y avait aucun moyen de charger dynamiquement des bibliothèques. Un ensemble d'API dyld (par exemple NSCreateObjectFileImageFromFile
, NSLinkModule
) a été introduit avec 10.1 pour charger et décharger les bundles, mais ils ne fonctionnaient pas pour les dylibs. Une dlopen
bibliothèque de compatibilité qui fonctionnait avec les bundles a été ajoutée en 10.3; dans 10.4, a dlopen
été réécrit pour être une partie native de dyld et un support supplémentaire pour le chargement (mais pas le déchargement) des dylibs. Enfin, 10.5 a ajouté la prise en charge de l'utilisation dlclose
avec dylibs et a déconseillé les API dyld.
Sur les systèmes ELF comme Linux, les deux utilisent le même format de fichier ; n'importe quel morceau de code partagé peut être utilisé comme bibliothèque et pour le chargement dynamique.
Enfin, sachez que sous Mac OS X, "bundle" peut également faire référence à des répertoires avec une structure standardisée qui contient le code exécutable et les ressources utilisées par ce code. Il y a un certain chevauchement conceptuel (en particulier avec les "bundles chargeables" comme les plugins, qui contiennent généralement du code exécutable sous la forme d'un bundle Mach-O), mais ils ne doivent pas être confondus avec les bundles Mach-O discutés ci-dessus.
Références supplémentaires: