2011-11-16 23 views
6

Mi compilador de C++ crea archivos "dylib" que contienen bibliotecas dinámicas. ¿Cuál es la diferencia entre los archivos .dylib y .so?¿Cuál es el significado de los archivos dylib?

¿Y cuál es la diferencia entre los archivos en formato Mach-O y los archivos en formato ELF? Tengo que crear archivos para su uso posterior en iOS (solo bibliotecas estáticas/Mach-O) y Android (ELF).

Gracias!

Respuesta

4

encontré que:

Una característica Mach-O que llega a mucha gente por sorpresa es la estricta distinción entre bibliotecas compartidas y carga dinámica de módulos. En los sistemas ELF, ambos son iguales; cualquier fragmento de código compartido se puede usar como biblioteca y para carga dinámica. Utilice otool -hv some_file para ver el tipo de archivo de algún_archivo.

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 enlazadores estáticos habituales, p. -lfoo para libfoo.dylib. Sin embargo, no pueden ser cargados como un módulo. (Nota: las bibliotecas compartidas pueden cargarse dinámicamente a través de una API. Sin embargo, esa API es diferente de la API para paquetes y la semántica lo hace inútil para una emulación dlopen() . Lo más notable es que las bibliotecas compartidas no se pueden descargar .) [Este ya no es verdadero; puede usar dlopen() con dylibs y bundles. Sin embargo, los dylibs aún no se pueden descargar.]

Los módulos cargables se denominan "paquetes" en Mach-O speak. Tienen el tipo de archivo MH_BUNDLE. Como ningún componente involucrado se preocupa por él, puede llevar cualquier extensión. La extensión .undle es recomendada por Apple, pero la mayoría del software portado usa .so por el bien de la compatibilidad con . Los paquetes se pueden cargar y descargar dinámicamente a través de dyld API, y hay un contenedor que emula dlopen() sobre esa API . [dlopen ahora es la API preferida.] 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.

Para compilar una biblioteca compartida normal en OS X, debe usar -dynamiclib y la extensión .dylib. -fPIC es el valor predeterminado.

Cuestiones relacionadas