2011-12-17 28 views
5

Quando ho compilato un programma no-op:Riduzione della dimensione del codice EXE di destinazione GCC?

int main(void) 
{ 
    return 0; 
} 

con vari compilatori:

  • GCC (risultato simile a LLVM così): diè eseguibile 10-KiB (compilato con -s)

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

    • Dipende msvcrt.dll e kernel32.dll

  • MSVC 2010: Ha dato un KiB eseguibile 5.5 (compilato con /MD /Ox)

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

    • Dipende msvcr100.dll e kernel32.dll

    • Avrebbe potuto essere ulteriormente ridotto attraverso la fusione .rdata con .text

  • di Windows Driver Kit 7.1: Ha dato un KiB eseguibile 6.5 (compilato con /MD /Ox, collegata con msvcrt_winxp.obj per consentirne l'esecuzione su XP)

    • Sezioni: .data, .rdata, .text

    • Dipende da msvcrt.dll e kernel32.dll

    • avrebbe potuto essere ulteriormente ridotto attraverso la fusione .rdata con .text

  • di Windows Driver Development Kit 2003: Ha dato un 3,5 Eseguibile KiB

    • Sezioni: .data, .rdata, .text

    • Dipende da msvcrt.dll

    • avrebbe potuto essere ulteriormente ridotto fondendo .rdata con .text

  • Piccolo compilatore C (TCC): dichiarino la 1.5 KiB eseguibili

    • Sezioni: .data, .text

    • Dipende da msvcrt.dll

Quindi credo che la questione è semplice:

E 'possibile ulteriormente ridurre le dimensioni eseguibili di destinazione di GCC o LLVM in modo che siano più vicini al minimo possibile, pur continuando a collegarsi a msvcrt.dll?

(Edit: io non sono, ovviamente, alla ricerca di confezionatori come UPX, etc.)

+0

Puoi spiegare perché stai chiedendo? Compilate spesso un programma così piccolo? Non è più importante per un compilatore compilare programmi ben realistici ?? (molti di questi sono molto più grandi)! –

+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

@Ulteriore: L'opzione '-s' è praticamente uguale a' strip'. Anche le altre opzioni non hanno aiutato. – Mehrdad

risposta

2

Questa non è una cosa particolarmente significativo da fare. Potrebbe essere possibile eliminare alcune cose, ma non appena si dispone di un programma che in realtà fa qualcosa, allora riavrà di nuovo quelle cose.

Ad esempio, su un'altra piattaforma (non faccio molto roba di Windows), la dimensione minima per un programma è maggiore di quanto si pensi perché ogni programma ha un gestore di atexit da pulire. Quel gestore ha un possibile errore, il che significa che tira in printf e tutte le cose I/O. Anche Atexit si occupa di malloc e di tutta la roba di gestione della memoria. E senza dubbio ci sono alcuni altri bit oltre. Il risultato finale è una dimensione binaria statica di 400 KB. Questo è fastidioso in un programma no-op, ma in realtà tutti i programmi avrebbero bisogno di questa roba, quindi è un punto controverso.

In generale, se si vuole ridurre al minimo dimensione del programma, compilare con -Os, e tenta di utilizzare -fltoo-fwhole-program (ma quest'ultima avrà bisogno di un sacco di modifiche alla procedura di build). Inoltre, non utilizzare -g e rimuovere i binari finali (se non li interrompe).

Problemi correlati