¿Cuál es la diferencia entre los archivos de biblioteca .so, .la y .a?

230

Sé que un .soarchivo es una especie de biblioteca dinámica (muchos subprocesos pueden compartir dichas bibliotecas, por lo que no es necesario tener más de una copia en la memoria). Pero, ¿cuál es la diferencia entre .ay .la? ¿Son todas estas bibliotecas estáticas?

Si las bibliotecas dinámicas tienen grandes ventajas sobre las estáticas, ¿por qué todavía hay muchas bibliotecas estáticas?

También quiero saber el mecanismo subyacente para cargar bibliotecas (ambos tipos) y cómo se invoca un fragmento de código en una biblioteca cuando se usa en alguna parte. ¿Qué parte del núcleo debería estudiar? ¿Y qué comando / utilidad de Linux relacionado debo saber para saber cómo se está ejecutando un proceso? (Solo conozco el ldcomando por ahora)

¿Cuándo debería intentar construir código en .soo .a? ¿Cuál es mejor?

[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep  2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror   931 Sep  2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep  2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep  2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror   932 Sep  2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep  2 23:25 openvpn-plugin-down-root.so
enormemeow
fuente
Ver también autotools.io/libtool/lafiles.html
Pacerier

Respuestas:

306

.soLos archivos son bibliotecas dinámicas . El sufijo significa "objeto compartido", porque todas las aplicaciones que están vinculadas con la biblioteca usan el mismo archivo, en lugar de hacer una copia en el ejecutable resultante.

.aLos archivos son bibliotecas estáticas . El sufijo significa "archivo", porque en realidad son solo un archivo (hecho con el arcomando, un predecesor tarque ahora solo se usa para hacer bibliotecas) de los archivos de objetos .o originales.

.laLos archivos son archivos de texto utilizados por el paquete "libtools" de GNU para describir los archivos que componen la biblioteca correspondiente. Puede encontrar más información sobre ellos en esta pregunta: ¿Para qué son los archivos .la de libtool?

Las bibliotecas estáticas y dinámicas tienen ventajas y desventajas.

Pro estático: el usuario siempre usa la versión de la biblioteca que ha probado con su aplicación, por lo que no debería haber problemas de compatibilidad sorprendentes.

Con estática: si se soluciona un problema en una biblioteca, debe redistribuir su aplicación para aprovecharla. Sin embargo, a menos que sea una biblioteca que los usuarios puedan actualizar por su cuenta, es posible que tenga que hacer esto de todos modos.

Pro dinámico: la huella de memoria de su proceso es menor, porque la memoria utilizada para la biblioteca se amortiza entre todos los procesos que la utilizan.

Pro dinámico: las bibliotecas se pueden cargar a pedido en tiempo de ejecución; Esto es bueno para los complementos, por lo que no tiene que elegir los complementos que se utilizarán al compilar e instalar el software. Se pueden agregar nuevos complementos sobre la marcha.

Con dinamismo: es posible que la biblioteca no exista en el sistema en el que alguien está intentando instalar la aplicación o que tenga una versión que no es compatible con la aplicación. Para mitigar esto, es posible que el paquete de la aplicación deba incluir una copia de la biblioteca, por lo que puede instalarlo si es necesario. Esto también es mitigado a menudo por los administradores de paquetes, que pueden descargar e instalar las dependencias necesarias.

Las bibliotecas dinámicas son especialmente útiles para bibliotecas del sistema, como libc. Estas bibliotecas a menudo necesitan incluir código que depende del sistema operativo y la versión específicos, porque las interfaces del kernel han cambiado. Si vincula un programa con una biblioteca de sistema estático, solo se ejecutará en la versión del sistema operativo para la que se escribió esta versión de biblioteca. Pero si usa una biblioteca dinámica, recogerá automáticamente la biblioteca que está instalada en el sistema en el que se ejecuta.

Barmar
fuente
1
@Barmar, ¿Entonces estás diciendo que las ventajas de las bibliotecas estáticas son mayores que las de las bibliotecas dinámicas?
Pacerier
44
@Pacerier No sé de dónde sacaste eso.
Barmar
13
Esa es una pregunta sin sentido. El peso de los pros y los contras depende de las circunstancias, no hay una respuesta universal. Parece que tienes una agenda e intentas provocarme.
Barmar
3
@ Barmar, no, soy inocente. Solo un curioso er.
Pacerier
11
Otro factor es la licencia: LGPL requiere enlaces dinámicos en un contexto comercial, es decir, donde no desea distribuir su fuente.
Sam