2011-12-17 15 views
5

Cuando compilado un programa de no-op:¿Reduciendo el tamaño del código EXE objetivo GCC?

int main(void) 
{ 
    return 0; 
} 

con varios compiladores:

  • CCG (resultado similar al LLVM así): dio un ejecutable 10-KiB (compilado con -s)

    • Secciones: .CRT, .bss, .data, .idata, .rdata, .text, .tls

    • Depende de msvcrt.dll y kernel32.dll

  • MSVC 2010: dio un KiB ejecutable 5,5 (compilado con /MD /Ox)

    • Secciones: .data, .rdata , .reloc, .text

    • Depende de msvcr100.dll y kernel32.dll

    • podría haber sido reducido aún más mediante la fusión de .rdata con .text

  • de Windows Driver Kit 7.1: dio un KiB ejecutable 6,5 (compilado con /MD /Ox, vinculado con msvcrt_winxp.obj para permitir que se ejecute en XP)

    • Secciones: .data, .rdata, .text

    • Depende de msvcrt.dll y kernel32.dll

    • podría haberse reducido aún más mediante la fusión de .rdata con .text

  • Kit de desarrollo de controladores de Windows 2003: Dio un 3,5 KiB ejecutable

    • Secciones: .data, .rdata, .text

    • Depende de msvcrt.dll

    • podría haberse reducido aún más mediante la fusión de .rdata con .text

  • Tiny C Compiler (TCC): dio una 1.5 KiB ejecutables

    • Secciones: .data, .text

    • Depende de msvcrt.dll

así que supongo que la pregunta es simple:

¿Es posible aún reducir los tamaños de ejecutables de destino de GCC o LLVM para que estén más cerca del mínimo posible, mientras se enlaza al msvcrt.dll?

(Edit: Yo, obviamente, no estoy buscando empacadores como UPX, etc.)

+0

¿Podría explicar por qué está preguntando? ¿Compila a menudo un programa tan pequeño? ¿No es más importante para un compilador compilar programas realistas? (¡la mayoría de ellos son mucho más grandes)! –

+0

http://stackoverflow.com/questions/1413171/what-is-strip-gcc-application-used-for, http://embeddedfreak.wordpress.com/2009/02/10/removing-unused-functionsdead-codes -with-gccgnu-ld/ – Ulterior

+0

@Ulterior: la opción '-s' es más o menos lo mismo que' strip'. Las otras opciones tampoco ayudaron. – Mehrdad

Respuesta

2

Esto no es una cosa particularmente significativo que hacer. Podría ser posible eliminar algunas cosas, pero tan pronto como tengas un programa que realmente haga algo, volverá a poner esas cosas en claro nuevamente.

Por ejemplo, en otra plataforma (no hago muchas cosas de Windows), el tamaño mínimo para un programa es más grande de lo que piensas porque cada programa tiene un controlador atexit para limpiar. Ese manejador tiene un posible caso de error que significa que tira de printf y todas las cosas de E/S. Atexit también saca Malloc y todas las cosas de entrega de memoria. Y sin duda hay algunas otras partes además. El resultado final es un tamaño binario estático de 400 KB. Eso es molesto en un programa no operativo, pero en realidad todos los programas necesitarían esto, así que es un punto discutible.

En general, si desea reducir al mínimo el tamaño del programa, compilar con -Os, y tratar de utilizar -fltoo-fwhole-program (pero esta última tendrá un montón de cambios en el procedimiento de construcción). Además, no use -g, y elimine los binarios finales (si eso no los rompe).

Cuestiones relacionadas