El formato de archivo de objeto Mach-O utilizado por Mac OS X para ejecutables y bibliotecas distingue entre bibliotecas compartidas y módulos cargados dinámicamente . Use otool -hv some_filepara ver el tipo de archivo de some_file.
Las bibliotecas compartidas de Mach-O tienen el tipo de archivo MH_DYLIBy llevan la extensión .dylib. Se pueden vincular con los indicadores de enlazador estático habituales, por ejemplo, -lfoopara libfoo.dylib. Se pueden crear pasando la -dynamiclibbandera al compilador. ( -fPICes el valor predeterminado y no necesita especificarse)
Los módulos cargables se denominan "paquetes" en Mach-O speak. Tienen el tipo de archivo MH_BUNDLE. Pueden llevar cualquier extensión; .bundleApple recomienda la extensión , pero la mayoría de los programas portados se utilizan .sopor razones de compatibilidad. Por lo general, usará paquetes para complementos que amplían una aplicación; en tales situaciones, el paquete se vinculará con el binario de la aplicación para obtener acceso a la API exportada de la aplicación. Se pueden crear pasando la -bundlebandera al compilador.
Tanto los dylibs como los paquetes se pueden cargar dinámicamente utilizando las dlAPI (por ejemplo dlopen, dlclose). No es posible vincular contra paquetes como si fueran bibliotecas compartidas. Sin embargo, es posible que un paquete esté vinculado a bibliotecas compartidas reales; esos se cargarán automáticamente cuando se cargue el paquete.
Históricamente, las diferencias fueron más significativas. En Mac OS X 10.0, no había forma de cargar bibliotecas dinámicamente. Se introdujo un conjunto de API dyld (por ejemplo NSCreateObjectFileImageFromFile, NSLinkModule) con 10.1 para cargar y descargar paquetes, pero no funcionaron para dylibs. Se dlopenagregó una biblioteca de compatibilidad que funcionaba con paquetes en 10.3; en 10.4, dlopense reescribió para ser una parte nativa de dyld y se agregó soporte para cargar (pero no descargar) dylibs. Finalmente, 10.5 agregó soporte para usar dlclosecon dylibs y desaprobó las API dyld.
En sistemas ELF como Linux, ambos usan el mismo formato de archivo ; cualquier pieza de código compartido se puede usar como biblioteca y para carga dinámica.
Finalmente, tenga en cuenta que en Mac OS X, "paquete" también puede referirse a directorios con una estructura estandarizada que contiene código ejecutable y los recursos utilizados por ese código. Existe cierta superposición conceptual (particularmente con "paquetes cargables" como complementos, que generalmente contienen código ejecutable en forma de paquete Mach-O), pero no deben confundirse con los paquetes Mach-O discutidos anteriormente.
Referencias adicionales: