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
    的工具对其进行分析并找到瓶颈。