Articulo de referencia

Encuadernación directa

El enlace directo es una característica del enlazador y del enlazador dinámico en Solaris y OpenSolaris . Proporciona un método que permite a las bibliotecas enlazar directament...

El enlace directo es una característica del enlazador y del enlazador dinámico en Solaris y OpenSolaris . Proporciona un método que permite a las bibliotecas enlazar directamente símbolos a otras bibliotecas, en lugar de enlazarlos débilmente y dejar que el enlazador dinámico determine qué biblioteca contiene el símbolo.

Teoría

Al enlazar una biblioteca compartida o un ejecutable de enlace dinámico, el enlazador normalmente rellena la tabla de símbolos de dicha biblioteca con todos los símbolos necesarios. Añade los símbolos al objeto actual con su desplazamiento y deja sin resolver los símbolos indefinidos. Los símbolos sin resolver deben conocerse en el momento del enlace, pero al enlazador se le pasan las bibliotecas compartidas con las que enlazar y, cuando encuentra un símbolo en otra biblioteca, añade una nota a la biblioteca de salida indicando que depende de esas otras bibliotecas compartidas.

Este tipo de enlace débil obliga al enlazador dinámico a determinar qué biblioteca contiene cada símbolo al ejecutar el programa. El enlazador dinámico en Linux, por ejemplo, lee la sección DT_NEEDED de un objeto ELF y carga las bibliotecas necesarias, pero no se le indica dónde se encuentran los símbolos requeridos. Para ello, debe recorrer cada símbolo sin resolver en el objeto y, para cada uno de ellos, recorrer cada biblioteca cargada, comprobando hasta encontrar un símbolo coincidente. Esto puede resultar lento.

El enlace directo soluciona este problema almacenando una lista equivalente de punteros a entradas DT_NEEDED en una sección ELF independiente. Cada puntero corresponde a un símbolo del objeto; por lo tanto, estos punteros crean una relación entre un símbolo y una entrada DT_NEEDED. Esto permite al enlazador localizar la biblioteca especificada por una entrada DT_NEEDED concreta y comprobar únicamente su tabla de símbolos para cada símbolo, en lugar de iterar por todas las bibliotecas posibles para cada símbolo.

Referencias

  • Encuadernaciones de biblioteca: seamos un poco más precisos, ¿de acuerdo? [ enlace eliminado ]
  • Trabajar en una implementación de enlace directo para Gentoo Linux.