Pregunta

En 'C', Linux,

¿Necesito bibliotecas estáticas para vincular estáticamente, o las compartidas que tengo son suficientes? ¿Si no, porque no? (¿No contienen los mismos datos?)

¿Fue útil?

Solución

Sí, necesita bibliotecas estáticas para crear un ejecutable vinculado estáticamente.

Las bibliotecas estáticas son paquetes de objetos compilados. Cuando se vincula estáticamente con la biblioteca, es efectivamente lo mismo que tomar los resultados de la 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 parte de la información, como las reubicaciones, ya se ha corregido y desechado.

Además, las bibliotecas dinámicas deben compilarse como código independiente de la posición. 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 intenta agrupar bibliotecas vinculadas dinámicamente en un ejecutable vinculado dinámicamente, pero es muy difícil generar un resultado que funcione correctamente en todas las circunstancias.

Otros consejos

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

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

Todas las bibliotecas que enlace 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, son archivos de formato diferente y, por lo tanto, necesita el tipo de coincidencia para su programa.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top