Quali sono le differenze tra .so e .dylib in macOS?

Dal porting del software Unix a Darwin e Mac OS X
a Quali sono le differenze tra .so e .dylib su osx?

2.1 Librerie condivise vs. moduli caricabili
Una caratteristica di Mach-O che colpisce molte persone di sorpresa è la rigida distinzione tra librerie condivise e moduli caricabili dinamicamente. Sui sistemi ELF entrambi sono la stessa cosa; qualsiasi pezzo di codice condiviso può essere usato come libreria e per il caricamento dinamico. Usate 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 collegate con i soliti flag statici del linker, ad esempio -lfoo per libfoo.dylib. Tuttavia, non possono essere caricate come modulo. (Nota a margine: le librerie condivise possono essere caricate dinamicamente attraverso un'API. Tuttavia, questa API è diversa dall'API per i bundle e la semantica la rende inutile per un'emulazione dlopen(). In particolare, le librerie condivise non possono essere scaricate.)
I moduli caricabili sono chiamati "bundle" nel linguaggio Mach-O. Hanno il tipo di file MH_BUNDLE. Poiché nessun componente coinvolto se ne preoccupa, possono avere qualsiasi estensione. L'estensione .bundle è raccomandata da Apple, ma la maggior parte del software portato usa .so per motivi di compatibilità. I bundle possono essere caricati e scaricati dinamicamente tramite le API di dyld, e c'è un wrapper che emula dlopen() sopra questa API. Non è possibile linkare i bundle come se fossero librerie condivise. Tuttavia, è possibile che un bundle sia collegato a vere e proprie librerie condivise; queste saranno caricate automaticamente quando il bundle viene caricato.