3.5. Uso de una biblioteca dinámica con GCC
Las bibliotecas dinámicas están disponibles como archivos ejecutables independientes, necesarios tanto en tiempo de enlace como de ejecución. Son independientes del archivo ejecutable de la aplicación.
Requisitos previos
- GCC debe estar instalado en el sistema.
- Un conjunto de archivos fuente o de objetos que forman un programa válido, que requiere alguna biblioteca dinámica foo y ninguna otra biblioteca.
- La biblioteca foo debe estar disponible como archivo libfoo.so.
Enlazar un programa con una biblioteca dinámica
Para enlazar un programa con una biblioteca dinámica foo:
$ gcc ... -Llibrary_path -lfoo...
Cuando un programa se enlaza con una biblioteca dinámica, el programa resultante debe cargar siempre la biblioteca en tiempo de ejecución. Hay dos opciones para localizar la biblioteca:
-
Utilizando un valor de
rpath
almacenado en el propio archivo ejecutable -
Uso de la variable
LD_LIBRARY_PATH
en tiempo de ejecución
Uso de un valor rpath
almacenado en el archivo ejecutable
El rpath
es un valor especial que se guarda como parte de un archivo ejecutable cuando se está enlazando. Más tarde, cuando el programa se cargue desde su archivo ejecutable, el enlazador en tiempo de ejecución utilizará el valor rpath
para localizar los archivos de la biblioteca.
Al enlazar con GCC, para almacenar la ruta library_path como rpath
:
$ gcc ... -Llibrary_path -lfoo -Wl,-rpath=library_path...
La ruta library_path debe apuntar a un directorio que contenga el archivo libfoo.so.
No hay espacio después de la coma en la opción -Wl,-rpath=
!
Para ejecutar el programa más tarde:
$ ./programa
Uso de la variable de entorno LD_LIBRARY_PATH
Si no se encuentra rpath
en el archivo ejecutable del programa, el enlazador en tiempo de ejecución utilizará la variable de entorno LD_LIBRARY_PATH
. El valor de esta variable debe cambiarse para cada programa. Este valor debe representar la ruta donde se encuentran los objetos de la biblioteca compartida.
Para ejecutar el programa sin rpath
establecido, con las bibliotecas presentes en la ruta library_path:
$ export LD_LIBRARY_PATH=library_path:$LD_LIBRARY_PATH
$ ./program
La omisión del valor rpath
ofrece flexibilidad, pero requiere la configuración de la variable LD_LIBRARY_PATH
cada vez que se vaya a ejecutar el programa.
Colocación de la biblioteca en los directorios por defecto
La configuración del enlazador en tiempo de ejecución especifica una serie de directorios como ubicación por defecto de los archivos de las bibliotecas dinámicas. Para utilizar este comportamiento por defecto, copie su biblioteca en el directorio apropiado.
Una descripción completa del comportamiento del enlazador dinámico está fuera del alcance de este documento. Para más información, consulte los siguientes recursos:
Páginas del manual de Linux para el enlazador dinámico:
$ man ld.so
Contenido del archivo de configuración
/etc/ld.so.conf
:$ cat /etc/ld.so.conf
Informe de las bibliotecas reconocidas por el enlazador dinámico sin configuración adicional, que incluye los directorios:
$ ldconfig -v