2009-06-20 43 views

Respuesta

10

Sí, necesita bibliotecas estáticas para compilar un ejecutable enlazado estáticamente.

Las bibliotecas estáticas son paquetes de objetos compilados. Cuando enlaza estáticamente con la biblioteca, es lo mismo que tomar los resultados de compilación de esa biblioteca, desempaquetarlos en su proyecto actual y usarlos como si fueran sus propios objetos.

Las bibliotecas dinámicas ya están vinculadas. Esto significa que cierta información, como las reubicaciones, ya se han solucionado y desechado.

Además, las bibliotecas dinámicas se deben compilar como código de posición independiente. Esto no es una restricción en las bibliotecas estáticas, y da como resultado una diferencia significativa en el rendimiento en algunas plataformas comunes (como x86).

Existen herramientas como ELF Statifier que intentan agrupar bibliotecas vinculadas dinámicamente en un archivo ejecutable dinámicamente vinculado, pero es muy difícil generar un resultado que funcione correctamente en todas las circunstancias.

+1

Gracias por una gran respuesta. Pero, ¿por qué es tan difícil? –

+2

ELF Statfier carga el ejecutable y todas sus bibliotecas, luego toma una instantánea de la memoria de proceso. Cuando se ejecuta la imagen de salida, cualquier cosa que provoque cambios en el diseño de la memoria (por ejemplo, VDSO aleatorizado) dará como resultado un funcionamiento incorrecto. Cualquier otro enfoque requiere reinventar el enlazador dinámico. – ephemient

+1

¿Por qué sería difícil volver a implementar el enlazador dinámico? ¿No hay solo dos tablas de las importaciones y exportaciones de la biblioteca para ser reubicadas? Es el enlazador, por lo que ya está implementando un enlazador estático, y conoce el formato de archivo del ejecutable y de la biblioteca dinámica, etc. – ChrisW

6

No existe la compilación estática, solo la vinculación estática. Y para eso, necesitas bibliotecas estáticas. La diferencia entre los enlaces estáticos y dinámicos es que con los primeros, los nombres se resuelven en tiempo de enlace (justo después del tiempo de compilación), mientras que con los segundos, se resuelven justo cuando el programa comienza a ejecutarse.

Las bibliotecas estáticas y dinámicas pueden contener o no la misma información, dependiendo de muchos factores. La decisión de vincular de forma estática o dinámica su código es importante y, a menudo, influirá en la arquitectura de la aplicación.

+0

Gracias, corregido 'compilar' a 'enlace'. –

2

Todas las bibliotecas que vincula a un programa enlazado estáticamente deben ser la variante estática. Si bien las bibliotecas dinámicas (libfoo.so) y estáticas (libfoo.a) tienen las mismas funciones en ellas, son archivos de formato diferentes y, por lo tanto, necesita el tipo coincidente para su programa.

1

Otra opción es Ermine (http://magicErmine.com) Es como un estacionario, pero es capaz de manejar la aleatorización de la memoria.

+0

Gran producto, gracias. –

Cuestiones relacionadas