Quiero hacer una solución rápida a una de las bibliotecas .so del proyecto. ¿Es seguro simplemente recompilar el .so y reemplazar el original? O tengo que reconstruir y volver a instalar todo el proyecto? O depende?¿Cómo hacer una corrección en una de las bibliotecas compartidas (.so) en el proyecto en Linux?
Respuesta
Depende. La biblioteca compartida debe ser binary-compatible con su ejecutable.
Por ejemplo,
- si ha cambiado el comportamiento de una de las funciones internas de la biblioteca, que probablemente no es necesario volver a compilar.
- Si cambió el tamaño de una estructura (por ejemplo, agregando un miembro) que la aplicación conoce, necesitará volver a compilar, de lo contrario la biblioteca y la aplicación pensarán que la estructura es más pequeña de lo que es, y se bloqueará cuando la biblioteca intenta leer un miembro adicional no inicializado en el que la aplicación no escribió.
- Si cambia el tipo o la posición de los argumentos de cualquier función visible desde las aplicaciones, necesita recompilar, porque la biblioteca intentará leer más argumentos de la pila que la aplicación ha puesto en él (este es el caso con C, en C++ los tipos de argumento son parte de la firma de la función, por lo que la aplicación rechazará la ejecución, en lugar de bloquearse).
La regla de oro (para las versiones de producción) es que, si usted no es consciente de que se está manteniendo la compatibilidad binaria, o no está seguro de lo que es la compatibilidad binaria, debe volver a compilar.
Con respecto a 3: los cambios en los parámetros predeterminados tienen un efecto nulo en ABI. Para llamadas cdecl (el valor predeterminado en C, y para esta llamada en GCC), la persona que llama realmente limpia la pila. También está bien pasar más parámetros de lo esperado, pero no menos para las convenciones de llamadas de derecha a izquierda. –
@Matt, no mencioné argumentos * predeterminados, solo argumentos. :) Además, es más común terminar con más argumentos en el lado de la biblioteca, en lugar de menos, por lo que la biblioteca intentará acceder a valores basura. –
Esa es sin duda la intención de usar bibliotecas dinámicas: si hay algo en la biblioteca que necesita actualizarse, entonces simplemente actualiza la biblioteca, y los programas que la usan no necesitan ser cambiados. Si la firma de la función que está modificando no cambia y logra lo mismo, entonces, en general, esto estará bien.
Por supuesto, siempre hay casos extremos en los que un programa depende de algún efecto secundario no documentado de una función, y luego el cambio de la implementación de esa función puede cambiar el efecto secundario y romper el programa; pero c'est la vie.
Si no ha cambiado el ABI de la biblioteca compartida, puede reconstruir y reemplazar la biblioteca.
Si no cambia la interfaz binaria de su biblioteca, puede recompilar y volver a implementar solo la biblioteca compartida.
buenas referencias:
Depende sí.
Sin embargo, supongo que tiene exactamente la misma fuente y el mismo compilador que compiló las otras cosas y ahora si solo cambia en un archivo .cpp
algo, está bien.
Otras cosas, p. cambiar una interfaz (entre la biblioteca compartida y el resto del sistema) en un archivo de encabezado no es correcto.
- 1. Fusionar varias bibliotecas .so compartidas
- 2. Carga dinámica de bibliotecas compartidas de Linux?
- 3. Empaquetar bibliotecas compartidas en el duende
- 4. Múltiples instancias de singleton en bibliotecas compartidas en Linux
- 5. ¿Cómo se determinan las rutas de dependencia de bibliotecas compartidas en Linux?
- 6. Dilema sobre las bibliotecas compartidas en Unix
- 7. ¿Cómo funciona el enlace a las bibliotecas de SO C en Windows y Linux?
- 8. Makefile para bibliotecas compartidas?
- 9. ¿Cómo depurar las bibliotecas compartidas en tiempo de ejecución?
- 10. excepciones entre bibliotecas compartidas en C++ g ++
- 11. ¿Cómo se muestran todas las bibliotecas compartidas utilizadas por los ejecutables en Linux?
- 12. ¿Cuáles son las buenas prácticas con respecto a las bibliotecas compartidas en Linux?
- 13. Mezcla de bibliotecas estáticas y bibliotecas compartidas
- 14. Error al cargar bibliotecas compartidas
- 15. lib {nombre de la biblioteca} .a/.so una convención de nomenclatura para las bibliotecas estáticas en Linux?
- 16. Cargando compartido bibliotecas que dependen de otras bibliotecas compartidas
- 17. ¿Cómo hacer que gdb imprima símbolos en bibliotecas compartidas cargadas con dlopen?
- 18. Git: Cómo manejar las bibliotecas de git en el proyecto
- 19. Automake y bibliotecas compartidas estándar
- 20. Bibliotecas compartidas opcionales
- 21. rutas relativas para bibliotecas compartidas
- 22. Cómo ejecutar el proyecto C# en Linux
- 23. ¿Cómo crear una biblioteca compartida (.so) en un script automake?
- 24. Medir el tamaño de las bibliotecas en Linux
- 25. Cómo hacer una ventana transparente en Linux
- 26. cómo incluir bibliotecas compartidas precompiladas en apk con eclipse
- 27. Crear bibliotecas estáticas y compartidas de C++
- 28. ubicaciones de bibliotecas compartidas para archivos mex de matlab:
- 29. Depuración de bibliotecas nativas para SO Android
- 30. ¿Cómo obtener la lista de bibliotecas compartidas ejecutables desde C++?
¿No corresponde al Makefile decidir qué componentes necesitan reconstrucción? Entonces debería ver qué archivos debe reemplazar. –
@ott: make no sabrá ni se preocupará por el tiempo de ejecución .sops a menos que usted lo diga. Definitivamente no es práctico dar lo que necesita para tomar una decisión sobre ABI. –