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)
 171
Author: Trent Davies, 2010-02-26

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:

 147
Author: Miles,
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.

 17
Author: Martin York,
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) .

 8
Author: Zachary Kraus,
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.

 2
Author: user2996950,
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