2013-05-16 69 views
4

每當我用C++ Builder(版本XE4,但以前的版本也這樣做)以發佈模式構建Win32 EXE時,它總是創建一個導出目錄併爲我的項目中的每個單元導出一個Initialize/Finalize條目。這導致成千上萬的不必要的出口。 Win64版本也有類似的問題,但是生成的導出並不是很多。禁用C++ Builder導出單元名稱?

快速檢查與DUMPBIN工具提供了以下(略)輸出:

Section contains the following exports for PROJECTX.exe 

    00000000 characteristics 
      0 time date stamp Thu Jan 01 00:00:00 1970 
     0.00 version 
      1 ordinal base 
     1205 number of functions 
     1205 number of names 

    ordinal hint RVA  name 

     1046  0 003ECF44 @[email protected] 
     1077  1 003ED64C @[email protected] 
     1053  2 003ED0D4 @[email protected]_ 
     1047  3 003ECF5C @[email protected] 
     1049  4 003ECF88 @[email protected] 
     ... 
     261 E0 000BD758 @@[email protected] 
     260 E1 000BD748 @@[email protected] 
     153 E2 0007EE70 @@[email protected] 
     152 E3 0007EE60 @@[email protected] 
     ... 

我擔心的是除了增加了PE文件的大小和加載時間,這些出口項目提供可能幫助反向元設計我的二進制文件,因此我想刪除它們。

hacky解決方案是在生成PE映像導出目錄後手動刪除它,但是必須在C++ builder IDE /編譯器中爲此解決此問題。

爲什麼C++ Builder會這樣做,以及如何禁用生成這些導出目錄條目?

更新:建立一個空的VCL形式的Win32發佈模式的應用程序默認生成以下出口...

Section contains the following exports for Project1.exe 

    00000000 characteristics 
      0 time date stamp Thu Jan 01 00:00:00 1970 
     0.00 version 
      1 ordinal base 
      5 number of functions 
      5 number of names 

    ordinal hint RVA  name 

      3 0 000036C8 @@[email protected] 
      2 1 000036B8 @@[email protected] 
      5 2 00006974 _Form1 
      1 3 00001F59 __GetExceptDLLinfo 
      4 4 000060AC ___CPPdebugHook 
+0

我從來沒有見過這種情況。我敢打賭,這不會發生在一個香草項目上。在這種情況下,你的項目有什麼不同? –

+0

我剛剛在發佈模式下構建了一個空的VCL表單應用程序,並且有鍋爐板的Finalize/Initialize導出條目Unit1 TForm類 – QAZ

+1

這對於Delphi不會發生。所以我刪除了Delphi標籤。 –

回答

7

如果您刪除自動生成的

#pragma package(smart_init) 

線您的.cpp文件的頂部,那麼C++ Builder將不會導出每單元InitializeFinalize方法。

認爲#pragma package(smart_init)如果你打算把你的.cpp文件包(而不是直接在一個exe)時才需要。所以我認爲在你的情況下刪除是安全的,docwiki有更多的細節。

雖這麼說,我不認爲這是值得擔憂:

  • 除非你確定這些正在對文件大小和/或加載時間產生重大的影響,也有更多的重要的事情要擔心。 (「過早優化是萬惡之源」,"always measure performance"優化之前等)
  • Delphi和C++ Builder的設計已經泄漏了大量用於逆向工程的信息。 Delphi的RTTI意味着任何__published屬性都嵌入到可執行文件中,並且有實用程序可從可執行文件中提取DFM。與此相比,從輸出InitializeFinalize方法泄漏的單元名稱相對較小。
  • 逆向工程是可能不像程序員經常做出的那樣大的擔心; (a)有充分的動機和技能的黑客可以逆向工程任何他想做的事情;(b)您和貴公司的知識,客戶關係和支持遠遠超過您的代碼中的任何算法。
+0

很好的答案,謝謝。 – QAZ

+0

+1好的理由保持這種默認行爲不變。 – Wolf

相關問題