Как удалить мертвый код из EXE-файла?

Возможный дубликат:
Уменьшить исполняемый файл

Какие есть инструменты, которые удаляют из EXE-файла весь неиспользуемый код и создают новый EXE-файл с кодом, действительно используемым приложением? Я думаю, что что-то подобное должно существовать. Просто из любопытства; но я думаю, что это может быть действительно хорошим инструментом для создания меньшего EXE-файла без неиспользуемого кода.

P.S.: Delphi создает отдельные EXE-файлы, которые содержат код всех объектов, используемых в приложении, но не все элементы этого объекта используются на самом деле. Это делает большие файлы. Я помню первую версию Паскаля, которая включала только реально используемый код и не вставляла неиспользуемый код, а EXE-файлы были меньше.


person Marcello Impastato    schedule 05.11.2012    source источник
comment
Возможный дубликат, Уменьшить исполняемый файл.   -  person LU RD    schedule 06.11.2012
comment
Вы уже задавали этот вопрос   -  person Roddy    schedule 06.11.2012
comment
Да, это правда, но в тот раз я спросил, как поступить с помощью delphi. И было дано предложение об этом. Теперь я, да, я спрашиваю о том же, но смотрю на проблему с другой стороны. Я вас, конечно, понимаю, но теперь я спрашиваю о некоторых инструментах, которые сканируют исполняемый файл и удаляют весь неиспользуемый код, перезаписывая исполняемый файл только с использованным кодом. В этом разница с вопросом, заданным несколько лет назад.   -  person Marcello Impastato    schedule 06.11.2012
comment
Очевидно, что Марчелло все еще работает над той же проблемой, @Lurd, но это не тот же вопрос. Этот вопрос касается способов взять EXE-файл и удалить неиспользуемый код. Предыдущий вопрос принял ответ, который включал изменение настроек компилятора и компоновщика; очевидно, что этот метод не будет работать с уже скомпилированным выходным EXE.   -  person Rob Kennedy    schedule 06.11.2012
comment
@Marchello: не существует инструмента, который бы безопасно модифицировал EXE-файлы, сокращая код внутри. Даже задать вопрос — значит показать непонимание того, насколько сложна эта задача даже на этапе компоновщика.   -  person Warren P    schedule 06.11.2012
comment
И такого инструмента не будет, потому что такой инструмент должен тестировать exe со всеми состояниями, которые когда-либо могли быть достигнуты, чтобы получить те части, которые действительно не используются. Для некоторых бывших вам потребуется несколько лет, чтобы получить желаемый результат. А усилие? Экономия некоторого количества МБ (стоит всего несколько центов), но при этом тратится много денег только на энергию.   -  person Sir Rufo    schedule 06.11.2012
comment
@Marcello, варианты уменьшения стандартного exe-файла были предоставлены RBA в другом вашем вопросе (например, exe-packer, upx).   -  person LU RD    schedule 06.11.2012


Ответы (2)


Текущая версия Delphi также исключает неиспользуемый код. Вы можете легко увидеть это в Delphi. Если вы скомпилируете, вы получите «синие точки» в канаве вашего кода. Неиспользуемые функции не отмечены синими точками, что означает, что они исключены. Если вы отметите флажок «Оптимизация» в параметрах проекта, код будет переписан для большего использования регистров, что позволит исключить некоторые переменные.

Тем не менее, исполняемые файлы Delphi растут, особенно при использовании определенных модулей. Я думаю, что самый маленький .exe, который вы можете создать в Delphi 7, весит около 10 КБ. В более поздних версиях это, вероятно, будет немного больше.

Важные причины размера файла:

  1. Ресурсы. Большие или много изображений занимают много места. Если вы используете значки в нескольких формах, обязательно поместите их в центральный список изображений (в общем источнике данных). Используйте одну из доступных реализаций PngImageList для уменьшения размера изображения при лучшем качестве.
  2. ртти. Информация о типе среды выполнения приводит к тому, что определения классов занимают дополнительное пространство. Это пространство частично связано с метаинформацией о классе, но в основном из-за всего лишнего кода. Любые методы, которые могут быть вызваны с использованием RTTI, могут быть связаны в виде «позднего связывания». Поэтому компилятор не может знать, можно ли исключить методы, поэтому он должен включить их в исполняемый файл.
  3. зарегистрированные классы. Аналогично 2. Если класс зарегистрирован, его можно получить и создать экземпляр, используя его имя в виде строки. Эти классы должны быть включены в проект, даже если они никогда не используются, просто потому, что компилятор не может знать, нужны ли они.

Это факт, что RTTI расширен в последних версиях Delphi. Я думаю, что это также приводит к тому, что метаинформация RTTI о классах занимает больше места. Есть только так много, что вы можете сделать об этом.

В общем, я думаю, что компилятор Delphi еще много оптимизирует. Вам не нужно беспокоиться о размере exe-файла. Если вы это сделаете, вы можете попробовать упаковщик, например upx. У меня хорошие впечатления от upx. Он сокращает исполняемые файлы примерно до одной пятой или даже меньше их первоначального размера, сохраняя при этом все функциональные возможности.

person GolezTrol    schedule 05.11.2012
comment
Привет, Голез, я скачал upx и лайкнул меня. Я прочитал обо всем, что вы рассказали, объясняя причину создания большого exe-файла. Мы говорим о делфи, конечно, но в целом я говорю о любом exe-файле, не обязательно сгенерированном из делфи. Я просто спрашиваю, есть ли какие-то инструменты, которые удаляют мертвый код (или неиспользуемый код) в exe-файле. PS: Спасибо Робу за то, что лучше понял мой вопрос. - person Marcello Impastato; 06.11.2012
comment
Из-за двух тегов Delphi и упоминания Delphi против Turbo Pascal в вашем вопросе я действительно не видел, что речь идет об исполняемых файлах в целом. Однако я заметил, что вы говорили об исполняемых файлах, поэтому я упомянул UPX. UPX работает со всеми исполняемыми файлами, а не только с теми, которые созданы с помощью Delphi, но если у вас есть исходный код, я бы работал с ним. - person GolezTrol; 06.11.2012

Если ваше приложение огромно, проверьте, не скомпилировано ли у вас много отладочной информации. Попробуйте сборку релиза и проверьте, не меньше ли она.

Что я иногда делаю, так это настраиваю проект для компиляции всех файлов .dcu в одну папку. Таким образом, вы быстро увидите все бесполезные модули, которые компилируются в ваш .exe. Часто бывает так, что вы включаете один блок для одной функции, а в итоге получаете целое дерево зависимых блоков. Вам просто нужно найти свои предложения использования и попытаться как-то избавиться от этих зависимостей.

Я думаю, что и gexperts, и cnpack содержат инструменты для отображения зависимостей или сканирования неиспользуемых модулей в вашем проекте. Они могут помочь в этом.

После того, как вы удалили бесполезные зависимости, вы всегда можете сжать скомпилированный exe-файл с помощью upx. У этого есть предполагаемые недостатки (Барри Келли писал об этом некоторое время назад), но у меня есть хороший опыт с этим. Иногда это делает файл в 4 раза меньше, что может иметь большое значение.

person Wouter van Nifterick    schedule 05.11.2012
comment
Привет, Воутер, спасибо за ответ. Да я знаю о тебе рассказал. Нет, в общем, я хотел попробовать посмотреть на вопрос с другой стороны: имея exe-файл, есть какие-то утилиты, которые сканируют этот exe-файл и очищают весь неиспользуемый код, перезаписывая новый exe-файл, в котором есть только действительно используемый код? В результате должен получиться новый файл меньшего размера. - person Marcello Impastato; 06.11.2012