2011-09-15 23 views
5

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?

+0

¿No corresponde al Makefile decidir qué componentes necesitan reconstrucción? Entonces debería ver qué archivos debe reemplazar. –

+0

@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. –

Respuesta

4

Depende. La biblioteca compartida debe ser binary-compatible con su ejecutable.

Por ejemplo,

  1. si ha cambiado el comportamiento de una de las funciones internas de la biblioteca, que probablemente no es necesario volver a compilar.
  2. 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ó.
  3. 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.

+0

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. –

+0

@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. –

1

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.

1

Si no ha cambiado el ABI de la biblioteca compartida, puede reconstruir y reemplazar la biblioteca.

1

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.

Cuestiones relacionadas