Главная arrow Лаборатория arrow Секреты Delphi arrow Уменьшаем Exe, удаляя релоки без сторонних утилит.  
06.02.2012
Главное меню
Главная
Лаборатория
Книги по дельфи
Инструменты
Статьи
Видео
Юмор
Ссылки
Поиск
База знаний Delphi
Общие вопросы
Windows, WinAPI
Графика, Звук
IDE Delphi
Консоль
Авторизация





Забыли пароль?
Вы не зарегистрированы. Регистрация
Каталог@Mail.ru - каталог ресурсов интернет
Уменьшаем Exe, удаляя релоки без сторонних утилит. Версия для печати
Рейтинг: / 73
ХудшаяЛучшая 
Написал 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 этими командами, после чего гуевые приложения становятся тоньше (что в общем-то, очевидно). Сам не пробовал пока...
Викентий - ОК   2010-06-21 01:17:59
Огромное спасибо, действительно команды {$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} сильно уменьшили :woohoo:
Darth Revan - Ошибочка   2010-07-01 17:53:23
Я так удаляю релокации в... Delphi 7 (программирую в Delphi 2010, а компилирую в Delphi 7).

Но если хочется малых размеров, то лучше писать на WinAPI. Но я пишу на KOL&MCK, ибо визульное программирование даёт о себе знать.
Stin - UPX рулит   2010-08-09 11:45:53
Может кому-то это покажется некорректным, но я использую программулину UPX. Прекрасно сжимает готовый exe-шник даже со стандартными настройками. Мне пока хватает.
Stin - в продолжение про UPX   2010-08-09 11:49:51
При первоначальном размере в 4,22 Мб после конвертации получаем 1,50 Мб. Мелочь, а приятно. :P При это ессно функциональность приложения полностью сохраняется. :whistle:
Snowy   2010-08-09 23:11:23
Ну UPX не единственный компрессор. Их много. Вот только сжимать или нет - вопрос спорный. Тут же не все так просто - у сжатия есть и минусы.
Для передачи можно и раром пожать. Или тем же 7z - с его оптимизаторами результат получше UPX'a будет.
Тут речь про выбрасывание ненужного мусора. А чем жать - раром или upx'ом - вопрос вторичный.
Igor   2010-10-14 20:40:02
Ну и чушь... Уж лучше использовать халявные компоненты KOL+MCK. И при этом не лишаться визуального программирования и на выходе получать очень маленькие программы.
Snowy - re:   2010-10-15 21:10:53
Igor написано:
Ну и чушь... Уж лучше использовать халявные компоненты KOL+MCK. И при этом не лишаться визуального программирования и на выходе получать очень маленькие программы.
А кто мешает тебе удалять релоки из программы, написанной на KOL? Этот спозоб работает и в консольных приложениях и вообще для голого WinAPI.
Анонимно - re: ОК   2010-12-05 23:21:15
Викентий написано:
Огромное спасибо, действительно команды {$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} сильно уменьшили :woohoo:


Даже при использовании этих директив размер exe-файла существенно больше чем в D2007. Чем объяснить такое распухание в Delphi XE/2010?
Анонимно   2010-12-05 23:54:48
Кое что есть по теме:
http://www.zipplet.co.uk/index.php/content/articles_programming_delphi2010rtti
ADR - re: re: ОК   2011-01-15 16:38:07
Анонимно написано:
Викентий написано:
Огромное спасибо, действительно команды {$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} сильно уменьшили :woohoo:


Даже при использовании этих директив размер exe-файла существенно больше чем в D2007. Чем объяснить такое распухание в Delphi XE/2010?

появились нові властивості і події такі як Touch
Игорь - ---   2011-02-09 08:42:13
на делфи 7 есть такой параметр (галочка а настройках) создавать пакеты запуска
так можно убрать эту галочку и ваш ехе будет весить всего 15 кб
конечно я пока не знаю какие проблемы потом могут быть с вашим ехе
но если вы решили писать трояна то это подойдет :D
Анонимно - re: ---   2011-04-07 06:30:44
Игорь написано:
на делфи 7 есть такой параметр (галочка а настройках) создавать пакеты запуска
так можно убрать эту галочку и ваш ехе будет весить всего 15 кб
конечно я пока не знаю какие проблемы потом могут быть с вашим ехе
но если вы решили писать трояна то это подойдет :D

проблема с трояном может быть одна - он не запуститься если на компе не будет установлена делфа - при отключении той галочки ехе-шник берет нужные ему файлы из системных папок
Анонимно   2011-06-22 03:25:42
цитата:
Респект, пример в студию

Окошко на делфи весом 1264 байта)) и без всякой упаковки.. все что надо для сборки ехе-шника есть в архиве http://virusoff.pisem.net/WINMIN.RAR
комментарии
Имя:
Заголовок:
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
Пожалуйста, введите проверочный код, который Вы видите на картинке.
 
< Пред.