Red Hat Training

A Red Hat training course is available for RHEL 8

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.

Atención

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