Как уменьшить размер exe?

3 ноября 2014 г. Просмотров: 337

Малый объем оперативной памяти и устройств долговременного хранения информации на персональных компьютерах в прошлом накладывал весьма жесткие ограничения на размер программ. Сегодня подобной проблемы не существует. Однако и сейчас иногда важно максимально уменьшить размер exe-модуля разрабатываемого приложения.

Вам понадобится

  • - исходный код;
  • - компилятор, линкер;
  • - компрессоры PE-модулей, такие как UPX, Themida.

Инструкция

  • Соберите release-версию исполняемого модуля приложения. Выберите в настройках проекта в IDE соответствующую конфигурацию. Если такой конфигурации нет, создайте ее на основе уже существующей. Измените список опций линкера, убрав и добавив соответствующие директивы. Так, при использовании пакета разработки от Microsoft, следует убрать опцию /debug. Можно также добавить в исходный код директиву:#pragma comment(linker,"/RELEASE")
  • Сконфигурируйте проект так, чтобы максимально избежать линковки исполняемого модуля со статическими библиотеками. Используйте разделяемые версии соответствующих библиотек. К примеру, можно исключить код библиотек времени исполнения C и C++, заменив опцию линкера /ML или /MT (статические одно- и многопоточные библиотеки) на /MD (многопоточная CRT DLL).
  • Рассмотрите вариант слияния различных секций exe-модуля в одну. Данный метод не даст заметного результата, если файл достаточно велик, но при исходном объеме модуля в 20-30 килобайт, выигрыш может оказаться существенным. Опция /merge линкера позволяет объединить секции. Можно задать ее через параметры проекта:/merge:.text=.data /merge:.reloc=.data /merge:.rdata=.dataили при помощи pragma-директив в исходном коде:#pragma comment(linker,"/merge:.text=.data")#pragma comment(linker,"/merge:.reloc=.data")#pragma comment(linker,"/merge:.rdata=.data")#pragma comment(linker,"/merge:.idata=.data")Также имеет смысл определить атрибуты результирующей секции:#pragma comment(linker,"/section:.data,rwe")
  • Уменьшите размер exe путем установки минимального значения величины блоков, по границам которых выравниваются секции. Используйте опцию линкера /filealign, заданную через редактирование свойств проекта или директиву pragma:#pragma comment(linker,"/filealign:0x200")Данный способ пригоден для маленьких модулей.
  • Попытайтесь уменьшить размер exe-файла, производя его сборку с параметрами оптимизации, направленной на сокращение объема машинного кода. Замените опции компилятора /O2 или /Od на /O1.
  • Замените стандартную заглушку DOS в exe-модуле на собственную, которая будет иметь минимальный объем. Используйте опцию линкера /stub:#pragma comment(linker,"/stub:mystub.exe")Здесь mystub.exe - имя исполняемого файла DOS, код которого будет добавлен в exe-модуль в качестве заглушки.
  • Рассмотрите вариант указания собственной точки входа в приложение. Это позволит исключить инициализирующий код статических библиотек времени исполнения. Используйте опцию линкера /entry, например:#pragma comment(linker,"/entry:MyStartup") void MyStartup(){ ::MessageBox(NULL, "Hello!", "Message!", MB_OK);}
  • Примените утилиты упаковки, такие как UPX, ASPack, Themida, PECompact к готовому exe-файлу. Данные модуля подвергнутся компрессии. Их распаковка будет осуществляться в память после запуска приложения. Этот метод дает хорошие результаты в отношении объемных exe-файлов, содержащих в себе большое количество статических данных с низкой энтропией (например, DIB-растры в секции ресурсов).
  • Оцените статью!