Quelles sont les différences entre .so et .dylib sous macOS ?


Du portage de logiciels Unix vers Darwin et Mac OS X
à Quelles sont les différences entre .so et .dylib sur osx?

2.1 Bibliothèques partagées vs modules chargeables
Une caractéristique de Mach-O qui frappe beaucoup de gens par surprise est la distinction stricte entre bibliothèques partagées et modules chargeables dynamiquement. Sur les systèmes ELF, les deux sont identiques ; tout morceau de code partagé peut être utilisé comme bibliothèque et pour le chargement dynamique. 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. Elles peuvent être liées avec les drapeaux habituels de l'éditeur de liens statiques, par exemple -lfoo pour libfoo.dylib. Cependant, elles ne peuvent pas être chargées en tant que module. (Note complémentaire : Les bibliothèques partagées peuvent être chargées dynamiquement par le biais d'une API. Cependant, cette API est différente de l'API pour les bundles et la sémantique la rend inutile pour une émulation dlopen(). Plus particulièrement, les bibliothèques partagées ne peuvent pas être déchargées.)
Les modules chargeables sont appelés "bundles" dans le langage Mach-O. Ils ont le type de fichier MH_BUNDLE. Comme aucun composant impliqué ne s'en soucie, 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é. Les bundles peuvent être chargés et déchargés dynamiquement via les API dyld, et il existe un wrapper qui émule dlopen() au-dessus de cette API. 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é contre de véritables bibliothèques partagées ; celles-ci seront chargées automatiquement lorsque le bundle sera chargé.