Скачать ASPack 2.43

Ini Editor — Программа является расширенным редактором файлов инициализации, которые имеют.
Платформа для создания и использования API. Postman упрощает каждый этап жизненного цикла API и.
SPRuler — экранная линейка, с помощью которой можно быстро и легко измерить в пикселях любые объекты на экране монитора.
Бесплатная программа, которая предназначена для сканирования и анализа содержимого.
GetWindowText — небольшая портативная (не требующая инсталляции) утилита с помощью которой можно.
Log Viewer Plus — удобный во всех отношениях просмотрищик лог-журналов с набором полезных инструментов для поиска и фильтрации информации в логе.
Как уменьшить размер файла exe
Как видно из заголовка статьи разговор будет о размере исполняемого файла при компилирование в Lazarus. Это частый вопрос у тех кто только недавно начал программировать в Lazarus. И так начнем.
Введение
Картинка для привлечения внимания

При первой компиляции в Lazarus проекта, многие удивляются размеру исполняемого файла . Ниже приведено сравнение размеров скомпилированного пустого проекта в разных средах программирования.
| Среда разработки | Размер файла по умолчанию (байт) | Размер файла с оптимизацией (байт) |
|---|---|---|
| Lazarus | 15 210 592 | 1 818 112 |
| Delphi XE7 | 11 510 970 | 2 277 376 |
| Delphi 7 | 368 128 | 368 128 |
Как видно из этой таблицы не все так уж и плохо у лазаруса в плане размеров, последние версии Delphi изрядно растолстели, как осенние белки. Но все же далеко ему и до Delphi 7. В общем есть куда стремится. Если же добавить на форму кучу разных компонент то размер файла будет весьма впечатляющий.
Вот пример размера файла самой среды Lazarus собранной с кучей установленных компонентов.

Все каких то 235 мегабайт. 235 мегабайт Карл. Файл lazarus.old.exe собран как раз таки с оптимизацией. Разница в размере видна невооружённым взглядом.
Большой размер исполняемого файла обусловлен тем что компилятор включает много дополнительной отладочной информации, которая помогает отлаживать программу. Но это все требуется зачастую на этапе отладки программы, конечному же пользователя не хочется сидеть и ждать когда через пол часа закачается программа. Вот для это и нужно эту лишнюю информацию исключать.
И так что для этого нужно сделать что бы программа созданная в лазарусе не занимала много места.
Настройка параметров компилирования
Пользователям старой версии лазаруса необходимо было в настройках проекта выставлять различные галочки для исключения лишней информации из файла. Было это примерно так.
Открывалась форма параметры проекта. И на вкладках выставлялись нужные галочки.
На вкладке Компиляция и компоновка снимались галочки.

На вкладке Отладка снималась галочка «Генерировать отладочную информацию» и ставилась галочка «Вырезать символы из исполнимого файла»

Данные настройки позволяют уменьшить размер файла.
В новой же версии Lazarus, на данный момент пишу это для версии 1.4.4 все несколько упростилось.
Теперь можно сделать так. Открываем параметры проекта и нажимаем на «Параметры компиляции». Затем нажимаем кнопку рядом с режимами сборки.

Появится окно параметров сборки. Тут нажимаем кнопку «Создать режимы отладочной и конечной сборки «. В окне появится еще два режима сборки, Release и Debug, такие же режимы если в последних версиях Delphi XE?.
Режим Release будет создавать маленький исполняемый файл.
После этого на панели инструментов появится кнопка выбора режимов.

Достаточно выбрать нужный режим.
Это методы используемые из среды разработки. Теперь про дополнительные методы.
Утилита Strip.exe
В комплекте с компилятором Free Pascal имеется замечательная утилита Strip.exe, которая вычищает отладочную информацию из исполняемого файла.
Утилита запускается из командной строки с параметрами
strip.exe —strip-all project1.exe
Но это не наш метод.
Сделать можно так.
Открываем меню Сервис — Настроить внешние средства.
В открывшемся окне необходимо добавить новый инструмент. Я сделал так.

Теперь можно пользоваться утилитой strip.exe прямо из среды разработки.
Утилита upx.exe.
Так же для уменьшения размеров файла можно использовать различные упаковщики. Они позволяют существенно уменьшить размер программы. А более продвинутые позволяют установить защиту на исполняемый файл или триальный период. Одной из самых распространенных программ для сжатия файлов является UPX. Данная утилита одна из самых простых в использовании. Из командной строки это делается так.
upx.exe —best project1.exe
Но опять же все можно упростить до минимума.
Как и в предыдущем методе делаем так .

И можем пользоваться утилитой из среды разработки.

Она сжимаем файл достаточно хорошо. И не особо уменьшает скорость запуска файла. Пример работы показан на изображение.

Почти троекратное сжатие файла.
Использование LLCL — Lazarus Light LCL
Недавно появились компоненты которые позволяют существенно уменьшить размер исполняемого файла. Это компоненты LLCL этакий аналог KOL для Delphi. Это набор файлов в которых переработанных классов free pascal (поправьте если ошибаюсь) где часть кода переписана на ассемблере, что позволяет уменьшить размер занимаемый исполняемым файлом. LLCL основан на базе Light VCL replacement for Delphi 7 наборе классов для Delphi 7 .
LLCL не требует установки его в Lazarus, достаточно просто в параметрах компиляции проекта сделать на них ссылку. И при сборке будут использоватся эти классы, а не стандартные от лазаруса.
В общем я сделал так . Скачал данный компоненты. Закинул их в папку где у меня лежат компоненты от лазаря. Затем создал простой проект с формой, на ней разместил несколько компонентов.

А затем собрал проект. Несколько ниже приведены полные результаты эксперимента. Затем я использовал компоненты LLCL. Делается это так. Открывается окно параметров проекта, затем выбирается пункт пути и нажимается кнопка «Другие модули».
В появившемся окне добавляем в верхнее окно путь к папке с файлами LLCL.

Затем нажал Ок и закрыл параметры проекта. И снова собрал проект снова. Исполняемый файл стал весьма меленьким. Решил еще оптимизировать проект. Удалил стандартную иконку из проекта. И пересобрал проект. Программа стала еще меньше. И под конец сжал её upx-ом. Результаты видно тут. Это очень замечательно. Можно писать очень маленькие вирусы утилиты на лазарусе.
P.S. Дальнейшие испытания показали что при использование LLCL придется применять крайне малый набор графических компонент. Это печально.

Вот собственно и все что можно на данный момент скачать о уменьшение размера приложения в Lazarus, если появится какой либо еще новый способ то я его обязательно опишу.
Магия слов и чисел
В интернетах есть несколько старых статей (тыц, тыц) про то, как уменьшить размер exe-файла, который генерирует Visual C++. Я взялся проверить актуальность рецептов, которые там приводятся, для Visual Studio 2010.
Задачу я взял классическую: найти 10 самых популярных слов в текстовом файле. Мой исходный файл был размером 73728 байт.
Начало
Вот мое изначальное решение, написанное за 8 минут и заработавшее со второй компиляции:
int main()
<
try <
string s = "input.txt" ;
ifstream inf(s.c_str(), ios::binary);
if (inf.good()) <
string word;
map<string, int > wc;
while (inf >> word) <
++wc[word];
>
inf.close();
vector< pair< int , string> > wcvec;
for ( auto i = wc.begin(), iend = wc.end(); i != iend; ++i) <
wcvec.push_back(make_pair(i->second, i->first));
>
sort(wcvec.begin(), wcvec.end());
for ( size_t i = wcvec.size() — 1 , j = 0 ; i >= 0 && j < 10 ; —i, ++j) <
cout << boost::format( "%6d %s \n " ) % wcvec[i].first % wcvec[i].second;
>
> else <
throw runtime_error( "No such file" );
>
> catch (exception& e) <
cerr << e.what() << endl;
> catch (. ) <
cerr << "Unknown error" << endl;
>
>
VC2010 в конфигурации Release выдал exe-файл размером 73728 байт. Посмотрим внутрь, что там столько жрет:
| Заголовок | 0x400 | |
| .text | 0xC400 = 50176 байт | В этой секции находится код |
| .rdata | 0x3A00 | строки, манглированные имена |
| .data | 0x0A00 | еще немного манглированных имен |
| .rsrc | 0x0200 | манифест |
| .reloc | 0x1200 | рассказ загрузчику как менять адреса в программе, если файл загружен не по тому адресу, по какому ожидал линкер |
Наш файл зависит от библиотек рантайма Visual C: msvcp100.dll, msvcr100.dll (10.0 здесь это версия, XP SP2 в стандартной поставке имеет только до 7.0), и, как и каждый исполнимый файл в системе, от kernel32.dll (тот, в свою очередь всегда тянет за собой ntdll.dll).
В памяти программа занимает максимум 2.5 мегабайта на входном файле в полмегабайта. В адресное пространство мапятся нужные dll, кодовые страницы и .nls, по странице (4 KB) жрут переменные окружения, параметры процесса, PEB и TIB, 574 страницы съедает heap и, вопреки опасениям, стек выделяется не весь сразу, а по мере надобности, в пике 3 страницы на сам стек и 1 на его guard page.
Сборка
Для начала попробуем уменьшить файл ключами компилятора и линкера. Я провел небольшое исследование, воспользовавшись, в том числе, утилитой, которая собирала программу, перебирая найденные ключи. Каких-то 8000 exe-файлов за ночь сборки, и я уже могу поделиться результатами 🙂
- /Os — Favor small code;
- /GS- — Buffer security check off (default /GS), это те самые __security_check_cookie;
- /Oy — Omit frame pointers (default /Oy-);
- /O1 — Minimize size (default /O2 maximize speed);
- /Ob2 — Inline function expansion. Теоретически, должно помогать, если есть много функций, которые вызываются только один раз, либо маленьких функций, которые вызываются один-два раза. Еще можно указать компилятору использовать интринсики вместо вызовов функций для некоторых функций с помощью прагмы вида #pragma intrinsic(memset, strlen, memcpy) ;
- /Oi — Enable intrinsic functions;
- /Gy- — отключить Enable function-level linking (default /Gy);
- /arch:SSE2 — включает расширенный набор инструкций за счет того, что программа перестает исполняться на старых процессорах (до Pentium 4);
- /MANIFEST:NO — отключает манифест;
- /MERGE:.rdata=.data /MERGE:.text=.data — сливает .text и .rdata в одну секцию;
- /ALIGN:16 — устанавливает минимальное выравнивание секции;
- Убрать /DEBUG — удаляет из exe-файла информацию о соответствующем PDB-файле;
- /DYNAMICBASE:NO /FIXED (default /DYNAMICBASE) — запрещает релоки и убивает их секцию (прощай, ASLR в Vista+, плюс, очевидно, не подходит для .dll);
- /ENTRY:»main» — меняет точку входа и отключает всю инициализацию, осуществляющуюся перед вызовом main (это ___security_init_cookie и ___tmainCRTStartup );
- /NODEFAULTLIB (использовать вместе с /GS-) — отключает все дефолтные библиотеки со всеми средствами языка. Верный способ получить ошибки линковки, если используется что-то кроме WinAPI;
- Убрать /EHsc — запретить Enable C++ exceptions (еще можно заменить их другими механизмами (SEH, extern C functions), но пользы от этого замечено не было);
- /GR- — выключить RTTI.
Отмечу, что с теми же опциями + /NODEFAULTLIB минимальный hello world с одним MessageBoxA занимает 640 байт (против 7186 байт в Release по дефолту и 28160 в Debug).
- Незачем убирать из .lib для линкера лишнее, он справляется сам;
- Незачем отключать совместимость с DEP (/NXCOMPAT:NO);
- #define WIN32_LEAN_AND_MEAN — стрипает windows.h, которого тут нет;
- #pragma comment(linker, «/SECTION:.data,EWRX») — во-первых, надо EWR, во-вторых, все равно не нужно, линкер ругается, но линкует;
- #pragma comment(linker, «/FILEALIGN:512») — директива была недокументированная и ее убрали;
- #pragma comment(linker, «/ALIGN:512») — по неведомой причине такая прагма бьет PE-файл, надо выставлять SectionAlignment в свойствах проекта, который действует на тот же ключ;
- #pragma comment(linker,»/merge:.rsrc=.data») или .reloc=.data — согласно MSDN, you shouldn’t merge .rsrc, .reloc, or .pdata into other sections и линкер отказывается это делать;
- #pragma comment(linker, «/opt:nowin98») — перекрывается /ALIGN;
- #pragma optimize(«gsy», on) — делает то же самое, что /Og (deprecated) /Os /Oy и, в принципе, является самым простым и безопасным способом уменьшить размер exeшника одной строчкой, но я уже разобрал ключи в отдельности.
Воспользовавшись Function list в одном известном дизассемблере и самописным скриптом, взвесим различные смысловые части кода в изначальном файле:
| Init and deinit | 889 |
| main | 1832 |
| Exceptions | 4537 |
| RTTI | 82 |
| Runtime checks | 527 |
| PE functions | 332 |
| Float arithmetics | 222 |
| Memory allocation | 413 |
| Locks | 12 |
| 8846 | |
| std memory fns | 1524 |
| std::allocator | 368 |
| std::exception types | 152 |
| std::iostream | 2022 |
| Locale and facets | 700 |
| std::fstream | 528 |
| std bufs | 3142 |
| std::map | 400 |
| std::_Tree | 2992 |
| std::vector | 1984 |
| std::basic_string | 3607 |
| std::char_traits | 128 |
| std::pair | 400 |
| std::sort | 4192 |
| std::heap | 993 |
| std comparisons | 160 |
| 23292 | |
| boost::format | 4128 |
| boost::io | 9216 |
| boost::optional | 48 |
| boost::base_from_member | 64 |
| boost::exception | 4184 |
| boost::detail | 234 |
| 17874 | |
| Overall: | 50012 |
Легко видеть, что boost, который здесь почти ничего не делает (чего не смог бы сделать банальный printf ), занимает почти треть кода. Заменяем, 42544 → 19744 байт.
Сказал Э, скажи Ю. Заменим весь iostream на fopen, printf и K°. 10865 байт.
Уберем sort и vector, заменив на insertion sort в простом массиве размера 10. 8336 байт.
Заменим map на unordered_map. 8896 байт. Ой, я пошутил, откатимся обратно. Внезапно хэш-таблица, которую бы я писал, если бы фашисты отобрали у меня STL, оказалась толще красно-черного дерева.
Выпилим исключения, все равно они здесь почти ничего не делают, и заменим на обработку ошибок в старом мерзком си-стиле. 8112 байта.
Да, поддержку C++ исключений теперь можно и отключить. 7360 байт. Все, больше ничего не смог придумать 🙂
Теперь можно расслабиться и проверить энтропию. Популярнейший упаковщик исполнимых файлов UPX пожал исходный файл до 32256 байт, с исправленным не справился из-за /align; проставил /align:512, upx пожал до 6144 байт, но побил файл. 7z пожал исходный файл до 29591 байт, а исправленный до 3955 байт. Есть еще простор для сжатия 🙂
Напомню, исходный код был написан за 8 минут, а оптимизация ключей компилятора и линкера с последующим переписыванием в более компактный вид заняла 18 часов.
UPD: По совету xproger и wizzard0 попробовал Crinkler, хитрый линкер для интрописателей. Как линкеру, ему нужен .obj, который генерирует студия в одну из папок проекта. Для начала следует собрать проект с отключенной Whole program optimization (/GL, оно немного увеличит студийный exe), затем исполнить команду вида:
crinkler.exe /ENTRY:main /SUBSYSTEM:CONSOLE /COMPMODE:SLOW kernel32.lib user32.lib msvcrt.lib msvcprt.lib main.obj
Подумав минуту, Crinkler выплюнет exe размером 3907 байт, который вообще не сжимается 7z! Теперь, думаю, простор для сжатия закончился 🙂
Уменьшение размера исполняемого файла в Lazarus
Cоздаваемые в Lazarus исполняемые файлы имеют довольно большой размер. Причин несколько. Во-первых, в exe-файле сохраняется вся отладочная информация. Во вторых — создаваемый exe-файл оптимизирован под скорость выполнения, а не под размер.
Чтобы уменьшить размер исполняемого файла необходимо в свойствах проекта (Проект — Параметры проекта) включить 4 ключа компиляции:
1) Вкладка Генерация кода: установить флажок «Умная компоновка» (-СХ);
2) Вкладка Компоновка: установить флажок «Умная компоновка» (-ХХ);
3) Вкладка Компоновка: установить флажок «Использовать внешний файл отладочных символов GDB»(-Xg);
4) Вкладка Компоновка: установить флажок «Вырезать символы из исполняемого файла»(-Xs).

Эта настройка позволяет сократить размер исполняемого файла в несколько раз. (Пустой проект с 12 МБ сокращается до 1 МБ).
Однако, можно еще сократить размер, если воспользоваться утилитами strip.exe и upx.exe. Первая вырезает из файла отладочную информацию, вторая сжимает запускаемый файл. Удобно создать bat-файл
compress.bat
и запускать сжатие одной командой:
Утилиты прикреплены ниже.
| Прикрепленный файл | Размер |
|---|---|
| Утилиты компрессии exe-файла Lazarus | 401.35 кб |
Комментарии
Здравствуйте,создал проект написал программу на лазарус,потом выставил и убрал все галочки для удаления отладочной инфы, сохранил и собрал проект ..но размер файла как был мегабайтный так ничего и не изменилось..
что я делаю не так?
и второй вопрос: скачал я утилиты компрессии exe-файла лазарус и как ими пользоваться?
если есть возможность объясните мне эти два вопроса по шагам
с Уважением Юрий