Red Hat Training

A Red Hat training course is available for RHEL 8

3.6. Uso de bibliotecas estáticas y dinámicas con GCC

A veces es necesario enlazar algunas bibliotecas estáticamente y otras dinámicamente. Esta situación conlleva algunos retos.

Introducción

gcc reconoce tanto las bibliotecas dinámicas como las estáticas. Cuando se encuentra la opción -lfoo gcc intentará primero localizar un objeto compartido (un archivo .so ) que contenga una versión enlazada dinámicamente de la biblioteca foo, y luego buscará el archivo de almacenamiento (.a) que contenga una versión estática de la biblioteca. Así, las siguientes situaciones pueden resultar de esta búsqueda:

  • Sólo se encuentra el objeto compartido, y gcc enlaza con él de forma dinámica.
  • Sólo se encuentra el archivo, y gcc enlaza con él de forma estática.
  • Se encuentran tanto el objeto compartido como el archivo, y por defecto, gcc selecciona la vinculación dinámica contra el objeto compartido.
  • No se encuentra ni el objeto compartido ni el archivo, y la vinculación falla.

Debido a estas reglas, la mejor manera de seleccionar la versión estática o dinámica de una biblioteca para enlazarla es teniendo sólo la versión encontrada por gcc. Esto puede controlarse hasta cierto punto utilizando u omitiendo los directorios que contienen las versiones de las bibliotecas, al especificar las -Lpath opciones.

Además, dado que la vinculación dinámica es la predeterminada, la única situación en la que debe especificarse explícitamente la vinculación es cuando una biblioteca con ambas versiones presentes debe vincularse estáticamente. Hay dos resoluciones posibles:

  • Especificación de las bibliotecas estáticas por ruta de archivo en lugar de la opción -l
  • Uso de la opción -Wl para pasar opciones al enlazador

Especificación de las bibliotecas estáticas por archivo

Por lo general, se indica a gcc que enlace con la biblioteca foo con la opción -lfoo opción. Sin embargo, es posible especificar la ruta completa del archivo libfoo.a que contiene la biblioteca:

$ gcc ... path/to/libfoo.a ...

Por la extensión del archivo .a, gcc entenderá que se trata de una biblioteca para enlazar con el programa. Sin embargo, especificar la ruta completa al archivo de la biblioteca es un método menos flexible.

Utilizando la opción -Wl

La opción gcc -Wl es una opción especial para pasar opciones al enlazador subyacente. La sintaxis de esta opción difiere de las otras opciones de gcc. La opción -Wl va seguida de una lista de opciones del enlazador separada por comas, mientras que otras opciones de gcc requieren una lista de opciones separada por espacios.

El enlazador ld utilizado por gcc ofrece las opciones -Bstatic y -Bdynamic para especificar si las bibliotecas que siguen a esta opción deben ser enlazadas estática o dinámicamente, respectivamente. Después de pasar -Bstatic y una biblioteca al enlazador, se debe restaurar manualmente el comportamiento de enlace dinámico por defecto para que las siguientes bibliotecas se enlacen dinámicamente con la opción -Bdynamic.

Para enlazar un programa, vincule la biblioteca first estáticamente (libfirst.a) y second dinámicamente (libsecond.so):

$ gcc ... -Wl,-Bstatic -lfirst -Wl,-Bdynamic -lsecond...
Nota

gcc puede configurarse para utilizar enlazadores distintos del predeterminado ld.

Recursos adicionales

  • Uso de la colección de compiladores de GNU (GCC)
  • Documentación de binutils 2.27