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_file
para ver el tipo de archivo de some_file
.
Las bibliotecas compartidas de Mach-O tienen el tipo de archivo MH_DYLIB
y llevan la extensión .dylib. Se pueden vincular con los indicadores de enlazador estático habituales, por ejemplo, -lfoo
para libfoo.dylib. Se pueden crear pasando la -dynamiclib
bandera al compilador. ( -fPIC
es 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; .bundle
Apple recomienda la extensión , pero la mayoría de los programas portados se utilizan .so
por 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 -bundle
bandera al compilador.
Tanto los dylibs como los paquetes se pueden cargar dinámicamente utilizando las dl
API (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 dlopen
agregó una biblioteca de compatibilidad que funcionaba con paquetes en 10.3; en 10.4, dlopen
se 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 dlclose
con 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: