Le format de fichier objet Mach-O utilisé par Mac OS X pour les exécutables et les bibliothèques fait la distinction entre bibliothèques partagées y modules chargés dynamiquement . Utilisez otool -hv some_file
pour voir le type de fichier de some_file
.
Les bibliothèques partagées de Mach-O ont le type de fichier MH_DYLIB
et portent l'extension .dylib. Ils peuvent être liés avec les drapeaux habituels de l'éditeur de liens statiques, par ex. -lfoo
pour libfoo.dylib. Ils peuvent être créés en passant l'option -dynamiclib
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 de 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 utilisent .so
pour des raisons de compatibilité. Typiquement, vous utiliserez les bundles pour plug-ins qui étendent une application ; dans ce cas, 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 le paramètre -bundle
au compilateur.
Les dylibs et les bundles peuvent être chargés dynamiquement à l'aide de la commande dl
API (par exemple dlopen
, dlclose
). Il n'est pas possible de lier les bundles comme s'il s'agissait de bibliothèques partagées. Cependant, il est possible qu'un bundle soit lié à des bibliothèques partagées réelles ; celles-ci seront chargées automatiquement lorsque le bundle sera 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 ex. NSCreateObjectFileImageFromFile
, NSLinkModule
) ont été introduits avec la 10.1 pour charger et décharger les paquets, mais ils ne fonctionnaient pas pour les dylibs. A dlopen
La bibliothèque de compatibilité qui fonctionne avec les bundles a été ajoutée en 10.3 ; en 10.4, dlopen
a été réécrit pour être une partie native de dyld et a ajouté le support du chargement (mais pas du déchargement) des dylibs. Enfin, 10.5 a ajouté la prise en charge de l'utilisation de dlclose
avec dylibs et a déprécié les API de dyld.
Sur les systèmes ELF comme Linux, les deux utilisent le même format de fichier ; tout morceau de code partagé peut être utilisé comme une bibliothèque et pour le chargement dynamique.
Enfin, sachez que dans Mac OS X, "bundle" peut también font référence à des répertoires dont la structure est normalisée et qui contiennent du code exécutable et les ressources utilisées par ce code. Il existe un certain chevauchement conceptuel (notamment avec les "paquets chargeables" comme les plugins, qui contiennent généralement du code exécutable sous la forme d'un paquet Mach-O), mais il ne faut pas les confondre avec les paquets Mach-O dont il est question ci-dessus.
Références supplémentaires :