language-agnostic macos dynamic-linking dll

language agnostic - ¿Está bien utilizar DYLD_LIBRARY_PATH en Mac OS X? Y, ¿cuál es el algoritmo dinámico de búsqueda de la biblioteca con él?



language-agnostic macos (3)

Para documentación sobre las variables de entorno del editor de enlace dinámico y cómo afectan la búsqueda de bibliotecas dinámicas, man dyld .

DYLD_LIBRARY_PATH

Esta es una lista de directorios separados por dos puntos que contienen bibliotecas. El vinculador dinámico busca en estos directorios antes de buscar en las ubicaciones predeterminadas para las bibliotecas. Le permite probar nuevas versiones de bibliotecas existentes.

Para cada biblioteca que usa un programa, el vinculador dinámico lo busca en cada directorio en DYLD_LIBRARY_PATH por turno. Si aún no puede encontrar la biblioteca, entonces busca DYLD_FALLBACK_FRAMEWORK_PATH y DYLD_FALLBACK_LIBRARY_PATH a su vez.

Use la opción -L para otool (1). para descubrir los marcos y las bibliotecas compartidas con las que el ejecutable está vinculado.

DYLD_FALLBACK_LIBRARY_PATH

Esta es una lista de directorios separados por dos puntos que contienen bibliotecas. Se usa como la ubicación predeterminada para las bibliotecas que no se encuentran en su ruta de instalación. Por defecto, se establece en $ (HOME) / lib: / usr / local / lib: / lib: / usr / lib.

DYLD_VERSIONED_LIBRARY_PATH

Esta es una lista de directorios separados por dos puntos que contienen posibles bibliotecas de anulación. El vinculador dinámico busca estos directorios para bibliotecas dinámicas. Para cada biblioteca encontrada dyld mira su LC_ID_DYLIB y obtiene la versión_actual y el nombre de la instalación. Dyld luego busca la biblioteca en la ruta del nombre de instalación. Cualquiera que tenga el mayor valor de current_version se usará en el proceso siempre que se requiera un dylib con ese nombre de instalación. Esto es similar a DYLD_LIBRARY_PATH, pero en lugar de anular siempre, solo reemplaza si la biblioteca suministrada es más reciente.

Leí algunos artículos que desalentaban el uso de DYLD_LIBRARY_PATH, ya que la ruta de la biblioteca dinámica debería repararse utilizando -install_name, @rpath y @loader_path.

En términos de hacer un programa que se ejecute tanto en Linux como en Mac OS X, DYLD_LIBRARY_PATH de Mac OS X hace exactamente lo mismo que LD_LIBRARY_PATH de Linux. Y, podemos compartir (casi) el mismo archivo make que no tiene el -nombre_instalación y @rpath.

  • ¿Está bien utilizar DYLD_LIBRARY_PATH en Mac OS X?
  • ¿Cuál es el algoritmo de búsqueda de biblioteca dinámica con Mac OS X cuando el binario no puede encontrar la biblioteca dinámica? directorio actual -> directorios DYLD_LIBRARY_PATH ...?

DYLD_LIBRARY_PATH no se comporta como LD_LIBRARY_PATH . La documentación de OS X dlopen ( https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/dlopen.3.html ) especifica que al proporcionar una ruta absoluta, primero buscará en ubicaciones especificado por DYLD_LIBRARY_PATH :

Cuando la ruta contiene una barra oblicua pero no es una ruta de estructura (es decir, una ruta completa o una ruta parcial a un dylib), dlopen () busca lo siguiente hasta encontrar un archivo Mach-O compatible: $ DYLD_LIBRARY_PATH (con el nombre de la hoja de la ruta) , luego la ruta suministrada (utilizando el directorio de trabajo actual para las rutas relativas), luego $ DYLD_FALLBACK_LIBRARY_PATH (con el nombre de la hoja de la ruta).

En otras palabras, si establece DYLD_LIBRARY_PATH en /Hello , las siguientes dos llamadas de dlopen :

dlopen("/Hello/libfoo.so", RTLD_NOW); dlopen("/World/libfoo.so", RTLD_NOW);

ambos resolverán en /Hello/libfoo.so . Esto es bastante contrario a la intuición, y representa una vulnerabilidad de seguridad. El software que usa dlopen no tiene forma de garantizar que está cargando las bibliotecas correctas (¿quizás anule DYLD_LIBRARY_PATH en su propio entorno?)


Como ha notado, DYLD_LIBRARY_PATH comporta como LD_LIBRARY_PATH en otro * nix. Sin embargo, hay otra variable de entorno que debe mirar llamada DYLD_FALLBACK_LIBRARY_PATH .

En general, estos son (tanto en osx como en linux) sugeridos solo para uso de desarrollo, ya que pueden causar errores de búsqueda de símbolos cuando se anula con una biblioteca que no tiene la misma tabla de símbolos. Un buen ejemplo de esto es cuando intenta anular la instalación predeterminada de VecLib (por ejemplo, blas lapack) con una instalación personalizada. Esto causará errores de símbolos no encontrados en las aplicaciones vinculadas al sistema VecLib si se establece DYLD_LIBRARY_PATH y viceversa (errores de búsqueda de símbolos en aplicaciones personalizadas) si no lo está. Esto se debe a que el sistema blas / lapack no es una implementación completa de las libs de ATLAS.

DYLD_FALLBACK_LIBRARY_PATH no producirá estos problemas.

Al instalar bibliotecas en una ubicación no estándar, DYLD_FALLBACK_LIBRARY_PATH es mucho más sensato. Esto buscará símbolos en las bibliotecas proporcionadas en las rutas predeterminadas y si el símbolo no se encuentra allí, vuelva a la ruta especificada.

El beneficio es que este proceso no causará errores de búsqueda de símbolos en las aplicaciones compiladas contra las bibliotecas predeterminadas.

En general, cuando las bibliotecas se instalan en ubicaciones no estándar, deben especificarse rutas absolutas que anulan la ambigüedad de la búsqueda dinámica.