Pregunta

QUIERO dlopen () cada biblioteca compartida en un directorio específico. Con el fin de hacer eso,
¿cuál es la forma más limpia para recuperar la ruta de búsqueda de Linux. O ¿Hay una manera más rápida de encontrar un directorio específico en ese camino?
POSIX sería mejor.

¿Fue útil?

Solución

POSIX no soporta un mecanismo para averiguar los directorios de la ruta de búsqueda de biblioteca compartida (no ordena LD_LIBRARY_PATH, por ejemplo), por lo que cualquier solución es inherentemente algo específico de la plataforma.

Linux presenta algunos problemas debido a que los valores a utilizar podría basarse en el contenido de /etc/ld.so.conf así como cualquier valor de tiempo de ejecución en la variable de entorno LD_LIBRARY_PATH; otros sistemas presentan problemas comparables. Las ubicaciones predeterminadas también varían según el sistema - con /lib y /usr/lib siendo habitual para las máquinas de Linux de 32 bits, pero /lib64 y /usr/lib64 que se utiliza en al menos algunas máquinas de 64 bits. Sin embargo, otras plataformas utilizan otras ubicaciones para el software de 64 bits. Por ejemplo, Solaris utiliza /lib/sparcv9 y /usr/lib/sparcv9, por ejemplo (aunque los documentos mencionan /lib/64 y /usr/lib/64, que son enlaces simbólicos a los directorios sparcv9). Solaris también tiene variables de entorno LD_LIBRARY_PATH_64 y LD_LIBRARY_PATH_32. HP-UX y AIX tradicionalmente utilizan otras variables que LD_LIBRARY_PATH - SHLIB_PATH y LIBPATH, IIRC - aunque creo que ahora AIX usos LD_LIBRARY_PATH también. Y, en Solaris, la herramienta de configuración de bibliotecas compartidas es 'crle' (Configurar entorno de ejecución de la vinculación) y el análogo de /etc/ld.so.conf está bien /var/ld/ld.config o /var/ld/64/ld.config. También, por supuesto, las extensiones en las bibliotecas compartidas varía (.so, .sl, .dylib, .bundle, etc).

Por lo tanto, su solución será la plataforma específica. Usted tendrá que decidir sobre las las ubicaciones predeterminadas, las variables de entorno para leer, y el archivo de configuración para leer, y la extensión de archivo correspondiente. Teniendo en cuenta esos, entonces es principalmente un SMOP - simple cuestión de programación:

  • Para cada directorio indicado por cualquiera de las fuentes:
    • Abra el subdirectorio correspondiente (opendir())
      • Lea cada nombre de archivo (readdir()) a su vez
      • Uso dlopen() en la ruta de los archivos pertinentes.
      • Haz lo análisis es relevante para usted.
      • Uso dlclose()
    • Uso closedir()

Véanse también las notas en los comentarios de abajo ... el tema completo es moderadamente lleno de variaciones de plataforma en plataforma.

Otros consejos

No estoy seguro de que es posible hacer eso y ser portátil. Dado que esta cuestión se trata de Linux, la portabilidad no puede ser de suma importancia. Entonces no entiendo la restricción POSIX. Podría aclarar?

Usted probablemente tendrá que poner en práctica ya sea la funcionalidad de búsqueda se detalla en man 8 ld.so, que incluye el escaneo de /etc/ld.so.conf, además de LD_LIBRARY_PATH, o hacer /lib/ld.so hacer lo que quiere para usted y analizar la salida. Una línea de comandos no exactamente bastante para que pudiera ser:

export LD_PRELOAD=THISLIBRARYSODOESNOTEXIST
strace -s 4096 /bin/true 2>&1 | sed -n 's/^open("\([^"]*\)\/THISLIBRARYSODOESNOTEXIST".*$/\1\/YOURSUBDIRHERE/gp'
unset LD_PRELOAD

A continuación, puede Enumerar los archivos con el POSIX llamadas opendir(3) y readdir(3).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top