Уменьшить размер целевого EXE-кода GCC? - PullRequest
5 голосов
/ 17 декабря 2011

Когда я скомпилировал неоперационную программу:

int main(void)
{
    return 0;
}

с различными компиляторами:

  • GCC (аналогично LLVM): дали исполняемый файл размером 10 КиБ (скомпилированный с -s)

    • Разделы: .CRT, .bss, .data, .idata, .rdata, .text, .tls

    • Зависит от msvcrt.dll и kernel32.dll

  • MSVC 2010: предоставлен исполняемый файл объемом 5,5 КиБ (скомпилирован с /MD /Ox)

    • Разделы: .data, .rdata, .reloc, .text

    • Зависит от msvcr100.dll и kernel32.dll

    • Может быть дополнительно уменьшено путем слияния .rdata с .text

  • Windows Driver Kit 7.1: дал исполняемый файл объемом 6,5 КБ (скомпилированный с /MD /Ox, связанный с msvcrt_winxp.obj, чтобы он мог работать на XP)

    • Разделы: .data, .rdata, .text

    • Зависит от msvcrt.dll и kernel32.dll

    • Может быть дополнительно уменьшено путем слияния .rdata с .text

  • Комплект для разработки драйверов для Windows 2003: дал исполняемый файл размером 3,5 КиБ

    • Разделы: .data, .rdata, .text

    • Зависит от msvcrt.dll

    • Может быть дополнительно уменьшено путем слияния .rdata с .text

  • Tiny C Compiler (TCC): дал исполняемый файл 1,5 КиБ

    • Разделы: .data, .text

    • Зависит от msvcrt.dll

Итак, я думаю, вопрос прост:

Можно ли еще уменьшить целевые размеры исполняемых файлов GCC или LLVM, чтобы они были ближе к минимально возможному, при этом оставаясь связанными с msvcrt.dll?

(Изменить: Я, очевидно, не ищу упаковщиков, таких как UPX и т. Д.)

1 Ответ

3 голосов
/ 18 декабря 2011

Это не особо значимая вещь.Возможно, удастся устранить некоторые вещи, но как только у вас появится программа, которая на самом деле что-то делает, она сразу же вернет эти вещи обратно.

Например, на другой платформе (я неДля Windows), минимальный размер программы больше, чем вы думаете, потому что каждая программа имеет обработчик atexit для очистки.Этот обработчик имеет возможный случай ошибки, что означает, что он извлекает printf и все вещи ввода / вывода.Сам Atexit также тянет в malloc и все, что связано с памятью.И, без сомнения, есть еще несколько других моментов.Конечный результат - статический двоичный размер 400 КБ.Это раздражает в неоперативной программе, но на самом деле все программы нуждаются в этом, так что это спорный вопрос.

В общем, если вы хотите минимизировать размер программы, скомпилируйте с -Os и попробуйтеиспользовать -flto или -fwhole-program (но это последнее потребует много изменений в вашей процедуре сборки).Кроме того, не используйте -g, и удалите последние двоичные файлы (если это не нарушает их).

...