2012-11-05 43 views
-2

可能重複:
Reduce exe file如何從EXE文件中刪除死代碼?

什麼是一些工具,給出一個EXE文件,刪除所有未使用的代碼,並與代碼的新的EXE文件真正使用的應用程序?我認爲這樣的事情應該存在。只是爲了好奇;但是我認爲它可以作爲生成較小的EXE文件而沒有未使用的代碼的工具。

P.S .: Delphi產生包含應用程序中使用的所有對象的代碼的獨立EXE文件,但並非真正使用此對象的所有元素。這使得大文件。我記得Pascal的第一個版本只包含真正使用的代碼,並沒有插入未使用的代碼,EXE文件也較小。

+1

可能的重複,[減少exe文件](http://stackoverflow.com/q/7398580/576719)。 –

+1

你已經提問這個問題了 – Roddy

+0

是的,但那次我問及如何使用delphi。有關於它的建議。現在我,是的,我問類似的事情,但從另一邊看問題。我理解你當然,但現在我問一些工具,有一個EXE文件「掃描」它,並清除所有未使用的代碼重寫EXE文件與使用的代碼只。這與幾年前的這個問題有所不同。 –

回答

0

如果您的應用程序非常龐大,請檢查您是否沒有編譯大量調試信息。 嘗試發佈構建並檢查它是否更小。

我有時候做的是配置項目,將所有.dcu文件編譯到一個文件夾中。這樣你很快就能看到所有編譯進你的.exe的無用單元。經常發生的情況是,您爲單個函數包含單個單元,但是反過來,您會得到一整棵依賴單元。你只需要搜索你的使用子句並嘗試以某種方式擺脫這些依賴關係。

我認爲gexperts和cnpack都包含顯示依賴項的工具,或者掃描項目中未使用的單元。他們可以對此有所幫助。

刪除無用的依賴關係後,始終可以用upx壓縮編譯好的exe文件。這樣做有缺點(巴里凱利前段時間寫過),但我對它有很好的體驗。它有時會使文件4x儘可能小,這可能是一個大問題。

+0

你好Wouter,謝謝你的回答。是的,我知道你告訴過你。沒有一般我想試圖從另一方面看問題:有一個exe文件,有一些實用程序「掃描」這個exe文件,並清除所有代碼未使用重寫一個新的exe文件,只有代碼真正使用?結果應該是一個更小維度的新文件。 –

1

當前Delphi還排除未使用的代碼。你可以很容易地在Delphi中看到這個。如果你編譯,你的代碼的水溝裏會出現「藍點」。沒有使用的功能沒有藍點,這意味着它們被排除在外。如果您選中項目選項中的優化複選框,代碼將被重寫以更多地使用寄存器,從而消除某些變量。

儘管如此,Delphi可執行文件的增長尤其是在使用某些單元時。我認爲你可以在Delphi 7中創建的最小的.exe大約是10Kb。在後面的版本中,這可能會更大一些。文件大小

重要的原因是

  1. 資源。大量或大量圖像消耗大量空間。如果您在多個表單上使用圖標,請確保將它們放在中央圖像列表中(在共享數據源上)。使用其中一個可用的PngImageList實現更小的圖像尺寸以提高質量。
  2. rtti。運行時類型信息導致類定義消耗額外的空間。這部分空間部分歸因於關於類的元信息,但主要是因爲所有額外的代碼。任何可能使用RTTI調用的方法都可能以一種「後期綁定」的方式進行綁定。因此,編譯器無法知道這些方法是否可以消除,因此需要將它們包含在可執行文件中。
  3. 註冊類。與2類似。如果某個類已註冊,則可以使用它的名稱作爲字符串提取並實例化該類。這些類必須包含在項目中,即使它們從未被使用過,只是因爲編譯器不知道它們是否需要。

這是RTTI在最近的Delphi版本中擴展的一個事實。我認爲這也會導致有關類的RTTI元信息消耗更多空間。對此你只能做很多事情。

一般來說,我認爲Delphi編譯器還是做了很多優化。你不必擔心exe文件的大小。如果你這樣做,你可以試試像upx這樣的打包機。我有很好的upx經驗。它將可執行文件的大小減少到原始大小的五分之一或更少,同時保留所有功能。

+0

你好Golez,我已經下載upx和像我一樣。我已經閱讀了你所說的解釋造成大exe文件的原因。他當然會談論德爾福,但總的來說,我會告訴任何exe文件,而不是delphi生成的必要文件。我簡單地問,是否有一些工具可以刪除exe文件中的已死代碼(或未使用的代碼)。 PS:感謝Rob爲了更好地理解我的問題。 –

+0

由於兩個Delphi標籤以及Delphi和Turbo Pascal在你的問題中的提及,我真的沒有看到這是關於一般的可執行文件。但是我注意到你談到了可執行文件,這就是爲什麼我提到了UPX。 UPX適用於所有可執行文件,而不僅僅是使用Delphi構建的那些可執行文件,但是如果你有源代碼,我會使用它。 – GolezTrol