Як зменшити розмір exe

Як зменшити розмір exe

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

Вам знадобиться

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

Інструкція

1. Зберіть release-версію виконуваного модуля програми. Виберіть у налаштуваннях проекту IDE відповідну конфігурацію. Якщо такого налаштування немає, створіть його на основі вже існуючої. Змініть список параметрів лінкера, прибравши і додавши відповідні директиви. Так, при використанні пакету розробки від Microsoft, слід прибрати опцію/debug. Можна також додати до початкового коду директиву:#pragma comment(linker,""/RELEASE"")

2. Зконфігуруйте проект так, щоб максимально уникнути лінковування виконуваного додатка зі статичними бібліотеками. Використовуйте розділені версії відповідних бібліотек. Наприклад, можна виключити код бібліотек часу виконання C і C++, замінивши параметр лінкера/ML або/MT (статичні одно- і багатопоточні бібліотеки) на/MD (багатопоточна CRT DLL).

3. Розгляньте варіант злиття різних секцій 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"")

4. Зменшіть розмір exe шляхом встановлення мінімального значення величини блоків, за межами яких вирівнюються секції. Використовуйте параметр/filealign для редагування властивостей проекту або директиви pragma:#pragma comment(linker,""/filealign:0x200 "") Цей спосіб придатний для маленьких додатків.

5. Спробуйте зменшити розмір exe-файлу, виконуючи його збирання з параметрами оптимізації, спрямованої на скорочення обсягу машинного коду. Замініть параметри компілятора/ O2 або/Od на/ O1.

6. Замініть стандартну заглушку DOS у exe-модулі на власну, яка матиме мінімальний обсяг. Скористайтеся параметром/stub:#pragma comment(linker,""/stub:mystub.ехе "") Тут mystub.exe - ім 'я виконуваного файлу DOS, код якого буде додано в exe-модуль як заглушку.

     7. Розгляньте варіант зазначення власної точки входу до програми. Це дозволить виключити ініціалізуючий код статичних бібліотек часу виконання. Скористайтеся параметром/entry, наприклад:#pragma comment(linker,""/entry:MyStartup"") void MyStartup(){ ::MessageBox(NULL, ""Hello!"", ""Message!"", MB_OK);}


8. Застосуйте утиліти упаковки, такі як UPX, ASPack, Themida, PECompact до готового exe-файлу. Дані модуля піддадуться компресії. Їх розпакування здійснюватиметься в пам 'ять після запуску програми. Цей метод дає хороші результати щодо об 'ємних exe-файлів, що містять в собі велику кількість статичних даних з низькою ентропією (наприклад, DIB-растри в секції ресурсів).