每当我使用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)
如果删除自动生成的
#pragma package(smart_init)
Run Code Online (Sandbox Code Playgroud)
从.cpp文件的顶部开始,然后C++ Builder将不会导出每个单元Initialize和Finalize方法.
我觉得那#pragma package(smart_init)如果你打算把你只需要.cpp文件包(而不是直接在一个exe).所以我认为在你的情况下删除是安全的,docwiki有更多的细节.
话虽如此,我认为这不值得担心:
Initialize和Finalize方法泄漏的单位名称相对较小. | 归档时间: |
|
| 查看次数: |
755 次 |
| 最近记录: |