2011-12-17 28 views
5

Kiedy opracowano program, nie-op:Zmniejszenie rozmiaru kodu EXE rozmiaru GCC?

int main(void) 
{ 
    return 0; 
} 

z różnymi kompilatory:

  • GCC (podobny wynik do LLVM również): Dał wykonywalny 10 KiB (sporządzoną z -s)

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

    • Zależy msvcrt.dll i kernel32.dll

  • MSVC 2010: Dał 5.5 KiB wykonywalny (skompilowany z /MD /Ox)

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

    • Zależy msvcr100.dll i kernel32.dll

    • mogła być zmniejszona przez scalanie .rdata z .text

  • systemu Windows Driver Kit 7.1: Dał 6.5 KiB wykonywalny (skompilowany z /MD /Ox, połączoną z msvcrt_winxp.obj aby umożliwić działanie na XP)

    • Sekcje: .data, .rdata, .text

    • Zależy od msvcrt.dll i kernel32.dll

    • mogło być dalej zredukowana poprzez połączenie .rdata z .text

  • Windows 2003 Development Kit Kierowca: Dał 3.5 Plik wykonywalny KiB

    • sekcje: .data, .rdata, .text

    • Zależy msvcrt.dll

    • mógł być dodatkowo zredukowana poprzez połączenie .rdata z .text

  • Tiny kompilator C (TCC) otrzymano 1.5 KiB wykonywalne

    • Sekcje: .data, .text

    • Zależy od msvcrt.dll

Więc myślę, że pytanie jest prosta:

Czy możliwe jest dalsze zmniejszyć docelowe rozmiary plików GCC lub LLVM tak, że są bliżej do minimum, a jednocześnie łączą się z msvcrt.dll?

(Edit: Ja oczywiście nie szuka pakerów jak UPX itp)

+0

Czy możesz wyjaśnić, dlaczego pytasz? Czy często kompilujesz taki malutki program? Czy nie jest ważniejsze, aby kompilator kompilował dobrze realistyczne programy? (większość z nich jest znacznie większa)! –

+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: Opcja '-s' jest prawie taka sama jak' strip'. Inne opcje również nie pomogły. – Mehrdad

Odpowiedz

2

To nie jest szczególnie sensowne posunięcie. Możliwe, że uda się wyeliminować kilka rzeczy, ale jak tylko masz program, który faktycznie robi cokolwiek, to znowu wyciągnie te rzeczy z powrotem.

Na przykład na innej platformie (nie robię zbyt wiele rzeczy w systemie Windows), minimalny rozmiar dla programu jest większy niż mogłoby się wydawać, ponieważ każdy program ma procedurę obsługi atexit do czyszczenia. Ten moduł obsługi ma możliwy przypadek błędu, co oznacza, że ​​pobiera on printf i wszystkie elementy I/O. Atexit się również ciągnie w malloc i wszystkie rzeczy do przekazywania pamięci. I bez wątpienia jest jeszcze kilka innych drobiazgów. Końcowym wynikiem jest statyczny rozmiar binarny 400 KB. To denerwujące w programie typu "no-op", ale w rzeczywistości wszystkie programy będą wymagały tego, więc jest to kwestia sporna.

W ogóle, jeśli chcesz zminimalizować rozmiar programu, skompilować z -Os, a także używać -fltolub-fwhole-program (ale ten ostatni będzie musiał wiele zmian do procedury budowlanej). Ponadto nie używaj -g i usuwaj ostateczne pliki binarne (jeśli to ich nie złamie).

Powiązane problemy