Малий обсяг оперативної пам’яті і пристроїв довготривалого зберігання інформації на персональних комп’ютерах в минулому накладав досить жорсткі обмеження на розмір програм. Сьогодні подібної проблеми не існує. Однак і зараз іноді важливо максимально зменшити розмір 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-растри в секції ресурсів).