Pregunta

Tengo una biblioteca estática *.lib creada usando MSVC en Windows.El tamaño de la biblioteca es, digamos, 70 KB.Luego tengo una aplicación que vincula esta biblioteca.Pero ahora el tamaño del ejecutable final (*.exe) es de 29 KB, menos que la biblioteca.Lo que quiero saber es:

  1. Dado que la biblioteca está vinculada estáticamente, estaba pensando que debería agregarse directamente al tamaño del ejecutable y que el tamaño final del exe debería ser mayor que eso.¿El formato Windows exe también comprime algo los datos binarios?

  2. ¿Cómo es para los sistemas Linux? ¿Cómo se relacionan los tamaños de la biblioteca en Linux (archivo *.a/*.la) con el tamaño del ejecutable de Linux (*.out)?

-ANUNCIO

¿Fue útil?

Solución

Hay información de administración adicional en el .lib archivo que no se necesita para el ejecutable final. Esta información ayuda al enlazador encontrar el código para acceder realidad. Además, la información de depuración se puede almacenar en el archivo .exe pero no en el archivo de <=> (no recuerdo donde la información de depuración se almacena para objs en un archivo lib, que podría estar en otro lugar).

Otros consejos

Una biblioteca estática en Windows y Unix es una colección de archivos .o .obj /. El enlazador se ve en cada uno de estos ficheros objeto y determina si es necesario para el programa de vincular. Si no es necesario, entonces el fichero objeto no conseguirá incluido en el ejecutable final. Esto puede conducir a los ejecutables que son más pequeños y luego la biblioteca.

EDIT: Como MSalters señala, en Windows de VC ++ compilador ahora es compatible con la generación de archivos de objetos que permiten enlaces a nivel de función, por ejemplo, ver aquí . De hecho, editar y continuación requiere esto, puesto que la edición-y-seguir tiene que ser capaz de reemplazar la parte más pequeña posible del ejecutable.

La biblioteca estática probablemente contenga varias funciones que nunca se utilizan.Cuando el vinculador vincula la biblioteca con el ejecutable principal, ve que ciertas funciones nunca se usan (y que sus direcciones nunca se toman ni se almacenan en punteros de función), simplemente descarta el código.También puede hacer esto de forma recursiva:Si nunca se llama a la función A() y A() llama a B(), pero nunca se llama a B() de otro modo, puede eliminar el código tanto para A() como para B().En Linux sucede lo mismo.

Aviso Legal . Ha sido un largo tiempo desde que se ocupó de la vinculación estática, así que tome mi respuesta con un grano de sal

Usted escribió: Me estaba pensando que debería añadir directamente al tamaño del ejecutable y el tamaño final exe debe ser más que eso

?

enlazadores Naive funcionan exactamente de esta manera - cuando yo estaba haciendo el desarrollo pasatiempo para los sistemas CP / M (hace un largo tiempo), esto era un problema real.

enlazadores modernos son más inteligentes, sin embargo - sólo vinculan en las funciones que hace referencia el código original, o según sea necesario

.

Adicionalmente a las respuestas actuales, se permite que el enlazador para eliminar definiciones de función si tienen código objeto idéntico -. Este está destinado a ayudar a reducir los efectos hinchazón de código de plantilla

Una biblioteca estática tiene que contener todos los símbolos se define en su código fuente, porque podría get ligado en un archivo ejecutable que necesita símbolo sólo eso específica. Pero una vez que se vincula en un archivo ejecutable, sabemos exactamente qué símbolos terminan siendo utilizados, y cuáles no lo hacen. Por lo que el enlazador puede eliminar trivialmente código no utilizado, recortar el tamaño del archivo por un montón. Del mismo modo, cualquier símbolo duplicados (cualquier cosa que se definen tanto en la biblioteca estática y el ejecutable que está vinculado en obtiene fusionado en una sola instancia.

@All: Gracias por los punteros. @ Greg Hewgill - Su respuesta fue un buen indicador. Gracias.

La respuesta me enteré fue el siguiente:

1.) Durante edificio de la Biblioteca lo que sucede es que si la opción "Mantener Programa DATABSE de depuración" en MSVC (o algo parecido) está en ON, a continuación, la biblioteca tendrá esta información de depuración hinchazón de su tamaño.  pero cuando i estáticamente incluyo esa biblioteca y crear un ejecutable, el enlazador tiras de todo lo que la información de depuración de la biblioteca antes de geenrating el exe y por lo tanto el tamaño exe es menor que la de la biblioteca.

2.) Cuando he deshabilitado la opción "Mantener Programa DATABSE de depuración", tengo una biblioteca cuyo tamaño era más pequeño que el ejecutable final, que era lo que pensaba es nromal en la mayoría de las situaciones.

-AD

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