C++ 如何分析动态库文件的数据部分?
我试图分析为什么从C++ 如何分析动态库文件的数据部分?,c++,windows,dll,linker,C++,Windows,Dll,Linker,我试图分析为什么从MSVC编译的.dll文件在VMmap中消耗了超过300MB的内存。这是我从垃圾箱中得到的: SECTION HEADER #3 .data name 12E441FC virtual size E0E000 virtual address (10E0E000 to 23C521FB) 206C00 size of raw data E0C600 file pointer to raw data (00E0C600 to 010131FF) 0
MSVC
编译的.dll
文件在VMmap
中消耗了超过300MB的内存。这是我从垃圾箱中得到的:
SECTION HEADER #3
.data name
12E441FC virtual size
E0E000 virtual address (10E0E000 to 23C521FB)
206C00 size of raw data
E0C600 file pointer to raw data (00E0C600 to 010131FF)
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
总结
12E45000 .data
4000 .idata
304000 .rdata
1B9000 .reloc
1000 .rsrc
B09000 .text
从DUMPBIN
的报告中,这个.dll
文件的数据部分消耗了超过300MB的内存,我试图找出哪个.lib
文件是最大的消耗者
因此,我分析了用户创建的所有.lib
文件。看起来他们的.data
部分都非常小,从几个字节到几个KB。还有一些系统.lib
文件,例如kernel32.lib
和user32.lib
,我没有分析它们
所以我想我的问题是:
.dll
文件是从.lib
文件链接而来的,并且可能会删除一些未使用的变量,因此此dll文件的.data
部分大小不应该小于所有.lib
文件的.data
部分的总和吗?若否,原因为何?全局/静态变量的大小是否包含在.obj
或.lib
文件中.dll
文件来确定巨大的内存消耗来自何处.map文件有帮助吗?它应该包含所有内容的列表,包括偏移量/位置和大小。您应该指定您使用的开发平台。对象和库文件格式取决于链接器;有些可能使用ELF标准。我建议您研究ELF格式。谢谢,我能够生成一个.map文件,然后使用名为
amap
的工具对其进行分析并找到瓶颈。