|
Уменьшаем Exe, удаляя релоки без сторонних утилит |
|
|
|
Статьи -
Статьи
|
Многие знают, что можно уменьшить размер exe файла, не используя упаковщики и не изменяя функциональность, путём удаления из exe таблицы релокаций. Обычно для этого используют сторонние утилиты. Например StripReloc Джордона Рассела. А теперь я расскажу страшную тайну. В Delphi 2006 и выше, релоки можно не удалять, а просто не создавать!
В Delphi 2006 появилась недокументированная директива компилятора {$SETPEFLAGS}. Она позволяет настроить несколько тонких моментов создания нашего бинарника. В первую очередь она интересна тем, что позволяет отключить создание таблицы релокаций. Внимание! Не отключайте таблицы релокаций в dll, bpl и др. файлах. Таблица релокации не нужна exe файлу, т.к. он всегда грузится по одному и тому же адресу. Использование директивы {$SETPEFLAGS} очень простое: - Откройте файл проекта (dpr)
- В uses добавьте Windows
- Ниже пропишите {$SETPEFLAGS IMAGE_FILE_RELOCS_STRIPPED}
Попробуйте скомпилировать файл до добавления этой директивы и после. Вы сами сможете убедиться, что размер exe уменьшился.
В дополнение хочу сказать, что использование SETPEFLAGS этим не ограничивается. У неё есть ещё масса интересных возможностей. Получить их полный список очень просто: - Откройте модуль Windows
- Найдите в нём поиском IMAGE_FILE_RELOCS_STRIPPED
Нашли? Ниже идёт целый список констант, начинающихся с IMAGE_FILE_ Справа идёт комментарий. Для включения нескольких инструкций, используйте or. Пример:{$SETPEFlAGS IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_DEBUG_STRIPPED or
IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED or
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP}Что я здесь сделал? - IMAGE_FILE_RELOCS_STRIPPED - отрезал релоки
- IMAGE_FILE_DEBUG_STRIPPED - Выбросил из ехе Debug информацию
- IMAGE_FILE_LINE_NUMS_STRIPPED - Выбросил из exe информацию о номерах строк
- IMAGE_FILE_LOCAL_SYMS_STRIPPED - Выбросил local symbols
- IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP - При запуске exe с компакта, флэшки, других извлекаемых устройств, считать exe в свап и запустить оттуда. Полезно, если нужно запустить программу с компакта, а потом попросить вставить другой...
- IMAGE_FILE_NET_RUN_FROM_SWAP - аналогично предыдущей, только для сетевых дисков
|