Cuáles son las diferencias between.so y.dylib en osx?
.dylib es la extensión de biblioteca dinámica en OSX, pero nunca me ha quedado claro cuándo no puedo / no debería usar un unix tradicional .so shared object.
Algunas de las preguntas que tengo:
- A nivel conceptual, cuáles son las principales diferencias entre .so y .dylib?
- ¿Cuándo puedo/debo usar uno sobre el otro?
- Trucos y consejos de compilación (Por ejemplo, el reemplazo de gcc-shared-cLPI, ya que eso no funciona en osx)
4 answers
El formato de archivo objeto Mach-O utilizado por Mac OS X para ejecutables y bibliotecas distingue entre bibliotecas compartidas y módulos cargados dinámicamente. Utilice otool -hv some_file
para ver el tipo de archivo de some_file
.
Las bibliotecas compartidas Mach-O tienen el tipo de archivo MH_DYLIB
y lleva la extensión .dylib. Se pueden vincular con las banderas de enlace estáticas habituales, por ejemplo, -lfoo
para libfoo.dylib. Se pueden crear pasando la bandera -dynamiclib
al compilador. (-fPIC
es el por defecto y no es necesario especificar.)
Los módulos cargables se llaman "paquetes" en Mach-O speak. Tienen el tipo de archivo MH_BUNDLE
. Pueden llevar cualquier extensión; la extensión .bundle
es recomendada por Apple, pero la mayoría del software portado usa .so
por razones de compatibilidad. Normalmente, usará paquetes para plug-ins que extienden 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 bandera -bundle
al compilador.
Tanto los dylibs como los bundles se pueden cargar dinámicamente usando las API dl
(p. ej. dlopen
, dlclose
). No es posible enlazar con paquetes como si fueran bibliotecas compartidas. Sin embargo, es posible que un paquete esté vinculado a bibliotecas compartidas reales; estas 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 manera de carga dinámicamente bibliotecas. Un conjunto de API dyld (p. ej. NSCreateObjectFileImageFromFile
, NSLinkModule
) se introdujeron con 10.1 para cargar y descargar paquetes, pero no funcionaban para dylibs. Se agregó una biblioteca de compatibilidad dlopen
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 dejó en desuso las API de dyld.
En sistemas ELF como Linux, ambos usan mismo formato de archivo ; cualquier pieza de código compartido se puede utilizar como biblioteca y para carga dinámica.
Finalmente, tenga en cuenta que en Mac OS X, "bundle" puede también referirse a directorios con una estructura estandarizada que contiene código ejecutable y los recursos utilizados por ese código. Hay cierta superposición conceptual (particularmente con "paquetes cargables" como los complementos, que generalmente contienen código ejecutable en forma de un paquete Mach-O), pero no deben confundirse con paquetes Mach-O discutidos anteriormente.
Referencias adicionales:
- Fink Porting Guide , la base para esta respuesta (aunque bastante desactualizada, ya que fue escrita para Mac OS X 10.3).
- ld (1) y dlopen (3)
- Temas de Programación de Bibliotecas Dinámicas
- Mach-O Temas de programación
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-05 23:45:38
El archivo .so no es una extensión de archivo UNIX para biblioteca compartida.
Resulta que es común.
Compruebe la línea 3b en página de ArnaudRecipes sharedlib
, Básicamente .dylib es la extensión de archivo mac utilizada para indicar una lib compartida.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-28 09:49:47
La diferencia entre .dylib y. so en mac os x es cómo se compilan. Para. so archivos que utiliza-compartido y para .dylib se utiliza-dynamiclib. Ambos, así y .dylib son intercambiables como archivos de biblioteca dinámica y tienen un tipo como DYLIB o BUNDLE. Aquí está la lectura de diferentes archivos que muestran esto.
libtriangle.dylib:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 17 1368 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS
libtriangle.so:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 17 1256 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS
triangle.so:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 X86_64 ALL 0x00 BUNDLE 16 1696 NOUNDEFS DYLDLINK TWOLEVEL
La razón por la que los dos son equivalentes en Mac OS X es por la compatibilidad hacia atrás con otros programas del sistema operativo UNIX que compilan al tipo de archivo .so.
Notas de compilación: si compila un archivo. so o un .archivo dylib necesita insertar la ruta correcta en la biblioteca dinámica durante el paso de enlace. Para ello, añada-install_name y la ruta del archivo al comando de enlace. Si no lo hace, se encontrará con el problema visto en este post: Mac Dynamic Library Craziness (Puede ser solo Fortran) .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:24
Solo una observación que acabo de hacer mientras construía código ingenuo en OSX con cmake:
Cmake ... - DBUILD_SHARED_LIBS = OFF ...
Crea archivos. so
Mientras que
Cmake ... - DBUILD_SHARED_LIBS = ON ...
Crea .dynlib archivos.
Quizás esto ayude a alguien.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-10 15:59:20