2010-03-08 18 views
7

Supongamos que tiene 2 bibliotecas compartidas, lib1.so y lib2.so, que tienen libcommon.a estáticamente vinculado en ellas. ¿Se quejaría el compilador de la referencia de símbolos ambiguos si vinculara dinámicamente tanto lib1.so como lib2.so? ¿O sería el compilador lo suficientemente inteligente como para saber que los símbolos de libcommon se comparten entre lib1 y lib2 y le permiten vincular dinámicamente con ambos?Vinculación con varias bibliotecas compartidas vinculadas todas contra una biblioteca estática común

Respuesta

2

La biblioteca estática se usaría para resolver los enlaces internamente pero el enlace externo no se propagaría a la interfaz de la biblioteca compartida, por lo que no habría conflicto. Cada biblioteca compartida incluiría su propia copia del código de biblioteca estática.

+4

Al menos en GNU/Linux, si creo una biblioteca compartida (.so) que enlaza con una biblioteca estática (.a), puedo acceder a cualquiera de los símbolos extraídos de la biblioteca estática desde un ejecutable que solo enlaza a la biblioteca compartida (.so), por lo que estoy bastante seguro de que los símbolos de la biblioteca estática _se_ propagan a través de la interfaz de la biblioteca compartida. Tal vez las cosas funcionen de manera diferente en algunos otros sistemas, pero la mayoría de los sistemas en los que he trabajado es el caso con las opciones predeterminadas del vinculador. –

+0

@Jay Walker: Por lo que vale, preferí tu respuesta. Independientemente de los mecanismos, la verdad fundamental es que no habrá conflictos. – Clifford

3

No habrá conflicto porque cuando se vincula a bibliotecas compartidas, el enlazador utilizará la definición de la primera biblioteca compartida que proporciona el símbolo y no buscará más en las otras bibliotecas compartidas. Los símbolos incluidos desde .a se exportarán en ambas bibliotecas compartidas, pero no entrarán en conflicto.

+0

Esto no es verdad. Hay símbolos débiles exportados y fuertes. Si hay desajuste entre fuerte, hay un error. – Trismegistos

0

Supongamos que las dos bibliotecas compartidas están vinculadas con las diferentes bibliotecas estáticas. Pero las bibliotecas estáticas contienen una función con el mismo nombre. Habría conflicto.

Estoy seguro de eso porque tengo una aplicación tcl/tk, carga dos bibliotecas tcl (.so). Ambas bibliotecas están enlazadas estáticamente con la biblioteca openssl. pero con una versión diferente Se produjo un error de segmentación cuando ejecuto la aplicación tcl. Lo trazo al openssl. Hay una implementación de función modificada en la nueva versión.

Cuestiones relacionadas