Pregunta

test.c:

int main()
{
    return 0;
}

No he utilizado ninguna bandera (soy un Novato a gcc), sólo el comando:

gcc test.c

He utilizado la última TDM acumulación de GCC en win32. El ejecutable resultante es casi 23KB, demasiado grandes para un programa vacío.

¿Cómo puedo reducir el tamaño del ejecutable?

¿Fue útil?

Solución

No siga sus sugerencias, pero por el bien de atracciones, lea este " historia ' sobre la fabricación de la más pequeña binario ELF posible.

Otros consejos

  

¿Cómo puedo reducir su tamaño?

  • No hacerlo. Usted acaba de perder el tiempo.
  • Use -s bandera para despojar símbolos (gcc -s)

Por defecto algunas bibliotecas convencionales (por ejemplo C de tiempo de ejecución) unido con su ejecutable. Echa un vistazo a las teclas --nostdlib --nostartfiles --nodefaultlib para más detalles. Opciones de enlace descrito aquí .

Por segunda opción verdadero programa es tratar opciones de optimización , por ejemplo, -OS (optimizar para el tamaño).

darse por vencido. en Linux x86, gcc 4.3.2 produce un binario 5K. ¡Pero espera! Eso es con la vinculación dinámica! El estáticamente binario enlazado es más de la mitad de un meg: 516K. Relajarse y aprender a vivir con la hinchazón.

Y dijeron Modula-3 no iría a ninguna parte debido a un 200K hola mundo binario!


En caso que quiera saber lo que está pasando, la biblioteca C de GNU está estructurado de tal manera como para incluir ciertas características si su programa depende de ellos o no. Estas características incluyen curiosidades tales como malloc y libre, dlopen, algunos procesamiento de cadenas, y en su conjunto bucketload de cosas que parece tener que ver con lugares y la internacionalización, aunque no puedo encontrar ningún páginas man relevantes .

Creación de pequeños ejecutables para programas que requieren los servicios mínimos es no un objetivo de diseño para glibc. Para ser justos, también ha sido no un objetivo de diseño para cada sistema en tiempo de ejecución que he trabajado con (alrededor de media docena).

En realidad, si el código no hace nada, es incluso justo que el compilador todavía crea un archivo ejecutable? ; -)

Bueno, en Windows cualquier archivo ejecutable todavía tendría un tamaño, aunque puede ser razonable pequeña. Con el sistema anterior de MS-DOS, una aplicación completa de no hacer nada sería más que un par de bytes. (Creo cuatro bytes para utilizar la interrupción 21h para cerrar el programa.) Por otra parte, las aplicaciones se cargaron directamente en la memoria. Cuando el formato EXE se hizo más popular, las cosas cambiaron un poco. Ahora ejecutables tenido información adicional sobre el proceso en sí, como la reubicación de los segmentos de código y datos, además de algunas sumas de comprobación e información de versión. La introducción de Windows agrega otro encabezado con el formato, a decir de MS-DOS que no podría ejecutar el ejecutable ya que necesita para funcionar bajo Windows. Y Windows lo reconocerá sin problemas. Por supuesto, el formato ejecutable también se amplió con la información de recursos, como mapas de bits, iconos y formas del diálogo y mucho, mucho más.

A que no hace nada ejecutable sería hoy en día estar entre 4 y 8 kilobytes de tamaño, dependiendo de su compilador y todos los métodos que ha utilizado para reducir su tamaño. Sería a un tamaño donde UPX en realidad resultar en ejecutables más grandes! bytes adicionales en su ejecutable podrían añadirse debido a que ha añadido ciertas bibliotecas a su código. Especialmente bibliotecas con datos o recursos inicializados agregarán una considerable cantidad de bytes. Adición de información de depuración también aumenta el tamaño del ejecutable.

Pero mientras todo esto tiene un buen ejercicio en la reducción de tamaño, usted podría preguntarse si es práctico para simplemente seguir preocuparse por hinchazón de las aplicaciones. Los discos duros modernos se dividen los archivos en segmentos y para los discos muy grandes, la diferencia sería muy pequeña. Sin embargo, la cantidad de problemas que se necesitaría para mantener el tamaño lo más pequeño posible ralentizar la velocidad de desarrollo, a menos que seas un desarrollador experto en los cuales se utiliza para estas optimizaciones. Este tipo de optimizaciones no tienden a mejorar el rendimiento y teniendo en cuenta el espacio de disco promedio de la mayoría de los sistemas, no veo por qué sería práctico. (Sin embargo, yo optimizar mi propio código de forma similar pero de nuevo, soy experimentado con estas optimizaciones.)


Interesado en la EXE cabecera ? Es comienza con las letras MZ, para "Mark Zbikowski". La primera parte es el encabezado MS-DOS de estilo antiguo para los ejecutables y se utiliza como un talón a MS-DOS diciendo que el programa es no un ejecutable de MS-DOS. (En el binario, se puede encontrar el texto que básicamente es lo único que hace 'Este programa no se puede ejecutar en modo DOS.':. Mostrando que el mensaje siguiente es el jefe del PE, que Windows reconocerá y utilizar en lugar de la MS-DOS cabecera. comienza con las letras PE de portable ejecutable . Después de esto segunda cabecera no será ejecutable en sí, dividido en varios bloques de código y datos. la cabecera contiene tablas de reasignación especiales que le dice al sistema operativo dónde cargar un bloque específico. y si se puede mantener a un límite, el ejecutable final puede ser menor que 4 KB, pero el 90% sería entonces la información de cabecera y ninguna funcionalidad.

Me gusta la forma en que el djgpp FAQ abordó este hace muchos muchos años :

  

En general, a juzgar tamaños de código observando el tamaño de los programas "Hola" no tiene sentido, porque estos programas consisten sobre todo en el código de inicio. ... La mayor parte de la potencia de todas estas características va desperdicia en programas "Hola". No hay ninguna razón para ejecutar todo ese código sólo para imprimir una cadena de 15 bytes y salida.

¿Cuál es el propósito de este ejercicio?

A pesar de tan bajo nivel de un lenguaje como C, todavía hay una gran cantidad de configuración que tiene que ocurrir antes de principal puede ser llamado. Algunos de que la instalación se maneja por el cargador (que necesita cierta información), algunos se maneja por el código que llama principal. Y entonces es probable que haya un poco de código de la biblioteca que cualquier programa normal tendría que tener. Al menos, es probable que haya referencias a las bibliotecas estándar, si están en archivos DLL.

Examinar el tamaño binario del programa de vacío es un ejercicio inútil en sí mismo. Se le dice nada. Si quieres aprender algo sobre el tamaño del código, trate de escribir programas que no estén vacíos (y preferiblemente no triviales). Comparación de los programas que utilizan las bibliotecas estándar con programas que hacen todo por sí mismos.

Si realmente quiere saber lo que está pasando en ese binario (y por qué es tan grande), luego averiguar el formato ejecutable conseguir una herramienta de copia binaria y tomar la cosa aparte.

¿Qué significa 'size a.out' informarle sobre el tamaño de los segmentos de código, datos y bss? La mayor parte del código es probable que sea el código de arranque (crt0.o clásicamente en las máquinas Unix) que se invoca por el o / s y hace trabajos de ajuste (como la clasificación de los argumentos de línea de comandos en argc, argv) antes de invocar main().

cinta de trayectoria en el binario para deshacerse de los símbolos. Con la versión de gcc 3.4.4 (cygming especial) me cae desde 10k a 4K.

Puede probar la vinculación de un tiempo de ejecución de encargo (la parte que llama principal) para configurar el entorno de ejecución. Todos los programas utilizan el mismo para configurar el entorno de tiempo de ejecución que viene con gcc, pero para su ejecutable que no necesitan datos o la memoria zero'ed. Los medios que podrían deshacerse de las funciones de biblioteca no utilizados como memset / establecimiento de memoria y reducir el tamaño crt0. Al buscar información sobre este aspecto en GCC en el entorno integrado. desarrolladores de sistemas integrados son en general las únicas personas que utilizan entornos de ejecución personalizados.

El resto es los gastos generales para el sistema operativo que carga el ejecutable. Usted no se va a misma cantidad allí a menos que melodía que con la mano?

El uso de GCC, compilar su programa usando -Os en lugar de uno de los otros parámetros de optimización (-O2 o -O3). Esto le indica que debe optimizar para tamaño en lugar de la velocidad. Por cierto, a veces puede hacer que los programas de correr más rápido que las optimizaciones de velocidad tendría, si algún segmento crítico pasa a encajar más bien. Por otro lado, -O3 puede realmente inducir aumentos de código de tamaño.

También puede haber algunas banderas enlazador diciéndole que dejar de código no utilizado desde el binario final.

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