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
Vinculación con varias bibliotecas compartidas vinculadas todas contra una biblioteca estática común
Respuesta
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.
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.
Esto no es verdad. Hay símbolos débiles exportados y fuertes. Si hay desajuste entre fuerte, hay un error. – Trismegistos
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.
- 1. Fusionar varias bibliotecas .so compartidas
- 2. ¿Puede una biblioteca estática XCode requerir vinculación con una biblioteca dinámica?
- 3. Vinculación estática en C#
- 4. Vinculación de dos bibliotecas compartidas con algunos de los mismos símbolos
- 5. Vinculación de una biblioteca compartida con una biblioteca estática: ¿la biblioteca estática debe compilarse de forma diferente que si una aplicación estuviera vinculándola?
- 6. Mezcla de bibliotecas estáticas y bibliotecas compartidas
- 7. Vinculación a bibliotecas estáticas
- 8. Vinculación estática con glibc y libstdC++
- 9. Makefile para bibliotecas compartidas?
- 10. Crear bibliotecas estáticas y compartidas de C++
- 11. Cargando múltiples bibliotecas compartidas con diferentes versiones
- 12. Automake y bibliotecas compartidas estándar
- 13. rutas relativas para bibliotecas compartidas
- 14. Bibliotecas compartidas opcionales
- 15. Aumentar la vinculación estática de la biblioteca en Xcode 4
- 16. Dependencias del proyecto Qmake (bibliotecas vinculadas)
- 17. Vinculación de dependencias de una biblioteca compartida
- 18. Java: cargar bibliotecas compartidas con dependencias
- 19. Vinculación estática selectiva de funciones de biblioteca en biblioteca compartida
- 20. "referencia indefinida" cuando se enlaza contra una biblioteca estática
- 21. C, C++: Bibliotecas compartidas: ¿Se cargan en la memoria funciones individuales o bibliotecas completas?
- 22. Vinculación en bibliotecas de prueba con CppUnit
- 23. Forma correcta de vincular una biblioteca estática utilizando GCC
- 24. Dilema sobre las bibliotecas compartidas en Unix
- 25. Orden de las bibliotecas vinculadas en ocamlbuild
- 26. cargar dinámicamente la biblioteca estática?
- 27. dlopen con dos bibliotecas compartidas, símbolos de exportación
- 28. Bibliotecas predeterminadas vinculadas por gcc?
- 29. Vinculación con biblioteca compartida versionado en Android NDK
- 30. Tiempo de carga para bibliotecas compartidas vs bibliotecas estáticas
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. –
@Jay Walker: Por lo que vale, preferí tu respuesta. Independientemente de los mecanismos, la verdad fundamental es que no habrá conflictos. – Clifford