Главная arrow Лаборатория arrow Секреты Delphi arrow Уменьшаем Exe, удаляя релоки без сторонних утилит.  
10.03.2010
Главное меню
Главная
Лаборатория
Книги по дельфи
Инструменты
Статьи
Видео
Юмор
Поиск
Новости
Лента новостей
Новости Delphi
Новости проекта
Новости инструментов
Разные новости
База знаний Delphi
Общие вопросы
Windows, WinAPI
Графика, Звук
IDE Delphi
Консоль
Голосования
Каталог@Mail.ru - каталог ресурсов интернет
комментарии
Уменьшаем Exe, удаляя релоки без сторонних утилит. Версия для печати
Рейтинг: / 57
ХудшаяЛучшая 
Написал Snowy   
08.05.2007
Многие знают, что можно уменьшить размер 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 - аналогично предыдущей, только для сетевых дисков
опубликовано
Добавить новыйПоиск
Sanchezzz     2008-03-18 19:40:45
класный матрериал. действительно классный материал. действительно полезная документация.
Анонимно   2008-07-24 07:58:49
Спасибо
Андрей - тьфу   2008-10-04 06:21:32
Дааааа... таблица релокаций конечно занимает невообразимо огромуную часть исполняемого фала ажж процента 3, если не меньше
Shedko - re: тьфу     2008-10-13 05:03:01
Андрей написано:
Дааааа
... таблица релокаций конечно занимает невообразимо огромуную часть исполняемого фала ажж процента 3, если не меньше

Это вам так "повезло", на одной программе проверил. без директив: 928 КБ, с директивами 880Кб, 48 кб просто исчезли =)
Monax   2009-02-13 17:21:03
Благодарен!
execom - Гы))     2009-04-06 07:35:11
Для того что бы уменьшить размеры проги на Delphi до размеров в несколько килобайт необходимо писать на чистом WinApi удаляя RTL и пакуя FSG)) При этом я лично изготавливал ехе-шник (простое пустое окно как стандартный проект в делфи) размером в 1400 байт)))) Вот это уменьшение))
Гы))   2009-06-01 09:21:23
мне кажется, что смысл delphi не в том, чтобы писать на чистом WinApi... :P
Legran   2009-06-03 07:53:29
Респект, пример в студию
Demon   2009-10-14 17:47:57
Рулез
Anton   2010-02-01 22:37:11
:idea: Предлагаю для 2010 версии еще две директивы, которые помогают неплохо:
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

Кстати советуют пересобирать VCL c этими командами, после чего гуевые приложения становятся тоньше (что в общем-то, очевидно). Сам не пробовал пока...
Добавить комментарий
Имя:
Веб-сайт:
Заголовок:
UBB-Код:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Security Image
Пожалуйста, введите проверочный код, который Вы видите на картинке.

Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved.

 
< Пред.