Если вы пишете на Delphi и задумывались над уменьшением размеров исполнимого файла, но не хотите использовать сжатие, то наверняка знаете про программы вроде
StripReloc, умеющие вырезать перемещаемые символы из exe-файлов. Однако после этого в файлах может оставаться другая избыточная информация, избавиться от которой можно только пересборкой файла.
/\_/\
.__/ o o \ PE Tool 0.6 revision 767
/~__;==t==/ Copyright © 2013-2017 Vladislav Javadov
(_____)_m_m)
Loading tregsvr.exe 983703 bytes 100.0%
Image data 985088 bytes 100.1%
Replacing stub C:\Tools\Pet.exe -960 bytes -93.8%
Stripping -911750 bytes -92.6%
Saving tregsvr.exe 73338 bytes 7.5%
Total -910365 bytes -92.5%
PE Tool — утилита пересборки файлов
PE Tool — утилита оптимизации PE-файлов путем их пересборки,
без сжатия. Реализованы следующие оптимизации:
-
Уменьшение заголовков PE за счет сокращения неиспользуемых записей каталога данных (data directory).
-
Вырезание отладочной информации, прикрепленных данных, пустых секций и секций без ссылок на них (ключ
-deep
).
- Вырезание перемещаемых символов (relocations) и секции экспорта из exe-файлов.
-
Удаление секций, заданых ключом
-dropsect
.
- Замена DOS-заглушки (stub) любой программой DOS или вытащенной на лету заглушкой другого PE-файла. Сама PE Tool имеет заглушку размером 60 байт, которую можно использовать по умолчанию.
- Обрезка секций по фактическим данным, с вырезанием повторяющиейся строки
PADDINGXXPADDING
, добавляемой системной функцией UpdateResource
при внедрении манифеста.
- Выравнивание секций на минимально возможное значение — 512 байт.
- Обрезка файла по границе фактических данных при сохранении —
ключ
-trunc
.
Дополнительные возможности:
- Установка требуемой версии ОС — ключ
-osver
.
- Установка флага
LARGE_ADDRESS_AWARE
— ключ -3gb
.
- Установка флага динамической базы образа (ALSR) — ключ
-aslr
.
- Установка флага совместимости с DEP (NX-битом) — ключ
-nx
.
Вызов программы
pet -strip -trunc -stub . MyFile.exe -into MyFile-stripped.exe
В процессе обработки выводится подробная статистика:
Loading tregsvr.exe 983703 bytes 100.0%
Image data 985088 bytes 100.1%
Replacing stub C:\Tools\Pet.exe -960 bytes -93.8%
Stripping -911750 bytes -92.6%
Saving tregsvr.exe 73338 bytes 7.5%
Total -910365 bytes -92.5%
Оптимизация программ на этапе сборки
В современных версиях Delphi есть возможность оптимизировать программы еще на этапе сборки, тогда обработка при помощи PE Tool не понадобится. Ключ
{$SetPEFlags}
присутствовал в Delphi еще при Borland, но никакого влияния на сборку программ не оказывал. В Embarcadero Delphi эта оплошность была исправлена, и теперь компоновщик строит программы с учетом заданных флагов. В какой конкретно версии Delphi ключ
{$SetPEFlags}
стал приниматься во внимание, мне пока неизвестно. Можете подсказать в комментариях, если знаете.
{$IFNDEF DEBUG}
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$ENDIF}
uses
Windows;
{$IFNDEF DEBUG}
{$SetPEFlags
IMAGE_FILE_RELOCS_STRIPPED or
IMAGE_FILE_DEBUG_STRIPPED or
IMAGE_FILE_LINE_NUMS_STRIPPED or
IMAGE_FILE_LOCAL_SYMS_STRIPPED}
{$ENDIF}
Из собранной с такими установками программы PE Tool ничего не выжмет, максимум несколько сот байт с ключом
-trunc
. С появлением расширенной RTTI Embarcadero Delphi создает больше секций в exe-файле, увеличившийся из-за этого заголовок PE уже не влезает в первые 512 байт, поэтому замена DOS-заглушки не дает выигрыша в размере, — он съедается выравниванием. Секции PE обязательно должны быть выровнены на 512 байт.
Особенности реализации
PE Tool реализована как клиент ExeImages — расширения библиотеки
CoreLite, изначально предназначавшегося не только для разбора образов PE, но и как основа для написания патчей. В настоящий момент не все запланированные возможности ExeImages реализованы, и PE Tool остается единственной программой, использующей этот модуль.
См. также
Комментариев нет :
Отправить комментарий
Выбрав в выпадающем списке пункт «Имя/URL», можно оставить комментарий от своего имени без предварительной регистрации.