Как да премахна мъртъв код от EXE файл?

Възможен дубликат:
Намаляване на exe файл

Кои са някои инструменти, които при даден EXE файл премахват целия неизползван код и създават нов EXE файл с код, който наистина се използва от приложението? Мисля, че нещо такова трябва да съществува. Само за любопитство; но мисля, че може да бъде наистина добър като инструмент за създаване на по-малък EXE файл без неизползван код.

P.S.: Delphi произвежда самостоятелни EXE файлове, които съдържат код на всички обекти, използвани в приложение, но не всички елементи на този обект наистина се използват. Това прави големи файлове. Спомням си първата версия на Pascal, която включваше само наистина използван код и не вмъкваше неизползван код, а EXE файловете бяха по-малки.


person Marcello Impastato    schedule 05.11.2012    source източник
comment
Възможен дубликат, Намалете exe файла.   -  person LU RD    schedule 06.11.2012
comment
Вече сте задавали този въпрос   -  person Roddy    schedule 06.11.2012
comment
Да, вярно е, но този път попитах как да използвам delphi. И беше дадено предложение за това. Сега аз, да, питам подобно нещо, но гледам на проблема от друга страна. Разбирам ви, разбира се, но сега питам за някои инструменти, които при наличие на exe файл го сканират и почистват целия неизползван код, пренаписвайки exe файл само с използван код. В това е разликата с този въпрос отпреди няколко години.   -  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 с всички състояния, които някога биха могли да бъдат достигнати, за да получи частите, които наистина не се използват. За някои бивши ще ви трябват няколко години, за да получите желания резултат. А усилието? Спестяване на някои MB (просто си струва няколко цента), но харчене на много пари само за енергия.   -  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 Kb. В по-късните версии това вероятно ще бъде малко по-голямо.

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

  1. ресурси. Големите или много изображения заемат много място. Ако използвате икони в множество формуляри, не забравяйте да ги поставите в централен списък с изображения (на споделен източник на данни). Използвайте една от наличните реализации на PngImageList за по-малък размер на изображението срещу по-добро качество.
  2. rtti. Информацията за типа по време на изпълнение кара дефинициите на класа да заемат допълнително място. Това пространство се дължи отчасти на мета информацията за класа, но главно на целия допълнителен код. Всички методи, които могат да бъдат извикани с помощта на RTTI, могат да бъдат обвързани по начин на "късно свързване". Поради това компилаторът не може да знае дали методите могат да бъдат елиминирани, така че трябва да ги включи в изпълнимия файл.
  3. регистрирани класове. Подобно на 2. Ако даден клас е регистриран, той може да бъде извлечен и създаден, като се използва името му като низ. Тези класове трябва да бъдат включени в проекта, дори ако никога не се използват, просто защото компилаторът не може да знае дали са необходими.

Факт е, че RTTI е разширен в последните версии на Delphi. Мисля, че това също кара RTTI мета информацията за класовете да заема повече място. Можете да направите толкова много за това.

Като цяло мисля, че компилаторът на Delphi все още прави много оптимизации. Не трябва да се притеснявате за размера на exe файла. Ако го направите, можете да опитате пакет като upx. Имам добър опит с upx. Той намалява изпълнимите файлове до около една пета или по-малко от първоначалния им размер, като същевременно запазва цялата функционалност.

person GolezTrol    schedule 05.11.2012
comment
Здравей Golez, изтеглих upx и харесвам мен. Прочетох за всичко, което казахте, обяснявайки причината, която прави голям exe файл. Говорим за delphi, разбира се, но като цяло говоря за всеки exe файл, който не е задължително генериран от delphi. Просто питам дали има някакви инструменти, които премахват умрял код (или неизползван код) в 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
Здравейте Wouter, благодаря за отговора. Да, знам за теб. Не, като цяло исках да опитам да погледна въпроса от друга страна: имайки exe файл, има някои помощни програми, които сканират този exe файл и почистват целия неизползван код, пренаписвайки нов exe файл, който има само наистина използван код? Резултатът трябва да бъде нов файл с по-малък размер. - person Marcello Impastato; 06.11.2012