2010-05-13 20 views
5

Estoy trabajando en una aplicación X11 normal.Carga dinámica de objetos compartidos usando dlopen()

De forma predeterminada, mi aplicación solo requiere libX11.so y las bibliotecas gcc C y math estándar. La aplicación puede ampliar las funciones con Xfixes, Xrender y el sistema de sonido ALSA. Sin embargo, estas características (Xfixes, Xrender y ALSA) son opcionales.

Para lograr este comportamiento, estoy utilizando el tiempo de ejecución cargando, es decir, libXfixes, libXrender y libasound serán dlopen() ed.

Por lo tanto, la aplicación puede funcionar en ausencia de tales bibliotecas.

Ahora mi pregunta:

What library names should I use when calling dlopen()? 

he observado que estos difieren de una distro a distro.
Por ejemplo, en openSUSE 11, son el nombre lo siguiente:

  • libXfixes.so
  • libXrender.so
  • libasound.so

En Ubuntu, sin embargo, los nombres tener un número de versión adjunto, como este:

  • libXfixes.so.3
  • libXrender.so.1
  • libasound.so.2

lo que tratar de abrir "libXfixes.so" fallaría en Ubuntu, aunque la lib obviamente allí. Solo tiene un número de versión adjunto. Entonces, ¿cómo debería manejar mi aplicación esto?
¿Debo dejar que mi aplicación escanee/usr/lib/first manualmente para ver qué libs tenemos y luego elegir una adecuada? ¿O alguien tiene una mejor idea?

Gracias chicos,

Andy

+0

También véase la respuesta aquí: http://stackoverflow.com/questions/15951672/loading-linux-libraries-at-runtime – AjayKumarBasuthkar

Respuesta

1

Debería abrir usando el SONAME de la biblioteca. Puedes ver eso usando readelf -d [libname].

Por ejemplo, en una de mis máquinas Fedora Linux, el SONAME de la biblioteca C es libc.so.6.

Los enlaces simbólicos de los nombres .so a los nombres .so.6 no están garantizados.Esos enlaces simbólicos solo son necesarios para compilar software y, por lo general, no están instalados en sistemas sin los paquetes de desarrollo.

No querrá terminar cargando una versión con un número diferente de todos modos, porque los cambios en el número indican las principales diferencias API.

+0

La mayoría de las bibliotecas son compatibles con versiones anteriores, lo que significa que una biblioteca con un nombre de usuario superior debería funcionar. Supongamos que escribe un programa que dlopen 'libc.so.6'. Luego, los desarrolladores de libc realizan una actualización importante y lanzan 'libc.so.7'. Ahora su programa se romperá innecesariamente porque el soname no coincide. –

+0

@ BjörnLindqvist: no, la mayoría de las bibliotecas * no son * compatibles con versiones anteriores. ¿De dónde sacaste esa idea? Y si son compatibles, entonces no cambian el número de versión principal. GNU libc ha estado en 6 desde hace mucho tiempo. –

+0

Puede incluir y usar las macros provistas para cargar las diversas bibliotecas compartidas de glibc. Otros paquetes pueden hacer cosas similares para proporcionar el nombre de la biblioteca a cargar. Consulte "man dlopen" para ver un ejemplo. –

-1

Por lo que he aprendido, que acaba de dlopen() (por ejemplo) "libXfixes.so", que es más probable un enlace a la más reciente archivo "libXfixes.so. 3" de todos modos, de un modo similar a éste:

$ file /usr/lib/libalpm.so 
/usr/lib/libalpm.so: symbolic link to `libalpm.so.4.0.3' 

una visión rápida de mis '//usr lib /' muestra, que casi todas las bibliotecas no es un enlace simbólico a su Nueva "archivo .X" numerada , y estoy seguro de que así es como se hace en otras distribuciones también.

Solo si necesita una versión específica de la biblioteca, explícitamente nombre la versión "libXfixes.so.2" por ejemplo.

+0

Véase también la respuesta aquí: http://stackoverflow.com/questions/15951672/loading -linux-libraries-at-runtime – AjayKumarBasuthkar

+0

Nunca debe dlopen el nombre, que solo es proporcionado por paquetes de desarrollo y no estará presente en un sistema de implementación de producción. –

Cuestiones relacionadas