禁用C++ Builder导出单元名称?

QAZ*_*QAZ 4 c++builder

每当我使用C++ Builder(版本XE4在发布模式下构建Win32 EXE,但之前版本也这样做)时,它总是创建一个导出目录并为项目中的每个单元导出一个Initialize/Finalize条目.这导致成千上万的不必要的出口.Win64版本存在类似的问题,但生成的导出并不多.

使用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 @$xp$13Gdipapi@INT16
      1077     1 003ED64C @$xp$13Gdipapi@PARGB
      1053     2 003ED0D4 @$xp$13Gdipapi@Unit_
      1047     3 003ECF5C @$xp$14Gdipapi@UINT16
      1049     4 003ECF88 @$xp$14Gdipapi@UINT32
       ...
       261    E0 000BD758 @@Find@Finalize
       260    E1 000BD748 @@Find@Initialize
       153    E2 0007EE70 @@Flags@Finalize
       152    E3 0007EE60 @@Flags@Initialize
       ...
Run Code Online (Sandbox Code Playgroud)

我担心的是除了增加PE文件大小和加载时间之外,这些导出条目提供的元数据可以帮助我对二进制文件进行逆向工程,因此我想将它们删除.

一个hacky解决方案是在构建之后手动删除PE映像导出目录,但是必须在c ++ builder IDE /编译器中为此提供解决方案.

为什么C++ Builder会这样做?如何禁用生成这些导出目录条目?

更新:在Win32 Release模式下构建一个空的VCL Forms应用程序默认情况下生成以下导出...

  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 @@Unit1@Finalize
          2    1 000036B8 @@Unit1@Initialize
          5    2 00006974 _Form1
          1    3 00001F59 __GetExceptDLLinfo
          4    4 000060AC ___CPPdebugHook
Run Code Online (Sandbox Code Playgroud)

Jos*_*ley 7

如果删除自动生成的

#pragma package(smart_init)
Run Code Online (Sandbox Code Playgroud)

从.cpp文件的顶部开始,然后C++ Builder将不会导出每个单元InitializeFinalize方法.

觉得#pragma package(smart_init)如果你打算把你只需要.cpp文件包(而不是直接在一个exe).所以我认为在你的情况下删除是安全的,docwiki有更多的细节.

话虽如此,我认为这不值得担心:

  • 除非您确定这些文件会对文件大小和/或加载时间产生可测量的影响,否则需要担心的是更重要的事情.("过早优化是所有邪恶的根源","在优化之前始终衡量绩效"等)
  • Delphi和C++ Builder的设计已经为逆向工程泄漏了大量信息.Delphi的RTTI意味着任何__published属性都嵌入在可执行文件中,并且有一些实用程序可以从可执行文件中提取DFM.与此相比,导出InitializeFinalize方法泄漏的单位名称相对较小.
  • 逆向工程可能不像程序员经常做到的那样令人担忧; 共识是:(a)充满动力和技能的黑客可以对他想要的任何东西进行逆向工程,并且(b)您和您公司的知识,客户关系和支持的价值远远超过代码中的任何算法.