【发布时间】:2013-05-16 13:09:58
【问题描述】:
每当我使用 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
...
我关心的是除了增加 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
【问题讨论】:
-
我从未见过这种情况。我敢打赌它不会发生在一个普通的项目上。在这种情况下,您的项目有何不同?
-
我刚刚在发布模式下构建了一个空的 VCL 表单应用程序,并且有样板 Unit1 TForm 类的 Finalize/Initialize 导出条目
-
德尔福不会发生这种情况。所以我删除了 Delphi 标签。
标签: c++builder