DLL 调试信息
Posted
技术标签:
【中文标题】DLL 调试信息【英文标题】:DLL Debug Information 【发布时间】:2017-04-23 10:09:01 【问题描述】:我创建了一个 DLL 的生产版本。使用 virustotal 扫描时,我注意到结果报告调试信息在文件中,如下所示。有人可以告诉我这个调试信息是什么,我该如何删除它? DLL 来自使用 Visual Studio Community 2017 构建的 c++。
在任何人给我一个通用的建议之前,我想说的是,我不需要调试信息,也不希望其他人获得此调试信息。
DLL 的 DUMPBIN /header 如下:
PE signature found
File Type: DLL
FILE HEADER VALUES
14C machine (x86)
5 number of sections
58FBCD28 time date stamp Sat Apr 22 22:37:44 2017
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
2102 characteristics
Executable
32 bit word machine
DLL
OPTIONAL HEADER VALUES
10B magic # (PE32)
14.10 linker version
10800 size of code
9800 size of initialized data
0 size of uninitialized data
2E64 entry point (10002E64)
1000 base of code
12000 base of data
10000000 image base (10000000 to 1001DFFF)
1000 section alignment
200 file alignment
6.00 operating system version
0.00 image version
6.00 subsystem version
0 Win32 version
1E000 size of image
400 size of headers
0 checksum
2 subsystem (Windows GUI)
140 DLL characteristics
Dynamic base
NX compatible
100000 size of stack reserve
1000 size of stack commit
100000 size of heap reserve
1000 size of heap commit
0 loader flags
10 number of directories
17E40 [ 14C] RVA [size] of Export Directory
17F8C [ 50] RVA [size] of Import Directory
1B000 [ 1E0] RVA [size] of Resource Directory
0 [ 0] RVA [size] of Exception Directory
0 [ 0] RVA [size] of Certificates Directory
1C000 [ 11CC] RVA [size] of Base Relocation Directory
17780 [ 38] RVA [size] of Debug Directory
0 [ 0] RVA [size] of Architecture Directory
0 [ 0] RVA [size] of Global Pointer Directory
0 [ 0] RVA [size] of Thread Storage Directory
177B8 [ 40] RVA [size] of Load Configuration Directory
0 [ 0] RVA [size] of Bound Import Directory
12000 [ 188] RVA [size] of Import Address Table Directory
0 [ 0] RVA [size] of Delay Import Directory
0 [ 0] RVA [size] of COM Descriptor Directory
0 [ 0] RVA [size] of Reserved Directory
SECTION HEADER #1
.text name
1069A virtual size
1000 virtual address (10001000 to 10011699)
10800 size of raw data
400 file pointer to raw data (00000400 to 00010BFF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
SECTION HEADER #2
.rdata name
6834 virtual size
12000 virtual address (10012000 to 10018833)
6A00 size of raw data
10C00 file pointer to raw data (00010C00 to 000175FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
Read Only
Debug Directories
Time Type Size RVA Pointer
-------- ------- -------- -------- --------
58FBCD28 coffgrp 264 0001782C 1642C 4C544347 (LTCG)
58FBCD28 iltcg 0 00000000 0
SECTION HEADER #3
.data name
1884 virtual size
19000 virtual address (10019000 to 1001A883)
800 size of raw data
17600 file pointer to raw data (00017600 to 00017DFF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000040 flags
Initialized Data
Read Write
SECTION HEADER #4
.rsrc name
1E0 virtual size
1B000 virtual address (1001B000 to 1001B1DF)
200 size of raw data
17E00 file pointer to raw data (00017E00 to 00017FFF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
Read Only
SECTION HEADER #5
.reloc name
11CC virtual size
1C000 virtual address (1001C000 to 1001D1CB)
1200 size of raw data
18000 file pointer to raw data (00018000 to 000191FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
42000040 flags
Initialized Data
Discardable
Read Only
Summary
2000 .data
7000 .rdata
2000 .reloc
1000 .rsrc
11000 .text
【问题讨论】:
文件的 .rdata 部分中的调试目录正在用于与调试无关的信息。在不破坏大量工具的情况下,Microsoft 无法真正修改数据目录,因此这是解决方法。例如,配置文件引导的优化信息,看起来像这样,大小差不多。否则,包含它总是一个好主意,当您的程序在生产中崩溃时,当您得到一个小型转储时,您将需要它。它没有透露任何敏感信息,因此不必为此担心。 Dumpbin.exe /headers 看看。 调试信息通常存储在单独的 .pdb 文件中,而不是可执行文件本身。在您的情况下,可执行文件可能有调试部分(您可以使用 Explorer 套件之类的东西进行探索)而不是调试信息。 @Hans Passant:我在上面添加了 DUMPBIN 输出。假设我仍然想摆脱“调试”信息,有可能吗?首先,我不知道转储。如果有人给我发垃圾,我不知道如何处理它,而且我没有时间或意愿去学习它。其次,我的代码很少崩溃——这只是个人喜好,所以得到转储的机会很小。我根本不需要转储和调试,因此我想删除所有调试痕迹和无关信息,以增加罗马尼亚和波兰脚本小子的乐趣。 这是我猜的,LTCG == Link Time Code Generation。实现 PGO 所需的功能。我可以研究如何关闭它,但毫无疑问东欧黑客知道这一点。 @Hans Passant:好吧,我希望你能有所收获。你说的话对我来说听起来像是一门外语。所以我会把它交给你的专家。希望这是我可以关闭的 VS 选项。实际上,不仅仅是脚本小子对调试和转储感到兴奋,微软也一样。如果他们得到一个垃圾场,他们会高兴地跳上跳下。除了我之外,似乎每个人都从这个调试信息中受益。这是不公平的。 【参考方案1】:要完全消除调试目录,请将/NOCOFFGRPINFO
添加到链接器命令行并关闭链接器/优化下的链接时间代码生成(即删除/LTCG
),在 VS2017 中默认启用该功能。
【讨论】:
感谢您的回答。我前段时间问过类似的问题,但没有运气。您是否也可以提供有关 TLS 目录的线索? ***.com/questions/31690723/…以上是关于DLL 调试信息的主要内容,如果未能解决你的问题,请参考以下文章
调试信息(断点等)存储在 VS2013、本机 C++ dll 项目中的位置在哪里?
VS2012:调试器启动时ntdll.dll中的断点没有更多信息