Як зменшити розмір 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.exe")

    Тут 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-растри в секції ресурсів).