【问题标题】:Symbols in VS-compiled BinariesVS 编译的二进制文件中的符号
【发布时间】:2018-04-25 13:15:10
【问题描述】:

我有以下问题: 是否可以在 Visual Studio 编译的 C++ 二进制文件中找到符号,或者符号是否只存储在 .pdb 或 .map 文件中?如果可以在二进制文件中找到它们,哪些设置决定了符号是否存储在那里?

或者换一种说法:二进制文件是否可能包含源代码的任何部分,无论是成员、函数还是其他任何部分。

谢谢

【问题讨论】:

  • DLL 至少应包含导出函数和变量的名称。 DLL 和 EXE 将包含它们希望从其他 DLL 解析的名称。

标签: c++ visual-studio binary symbols


【解决方案1】:

您可以在构建时选择是否将调试信息嵌入库而不是 pdb - 请参阅 Debug Information Format 中的 /Z7。因此,如果您发布 .libs 或 .objs 这可能是个问题。但是,当最终的 exe/dll 创建完成时,这些信息将不存在 - 它将被放入 PDB。

DLL 导出的函数和变量将被命名,以便调用者可以找到它们。

使用__FUNCTION__ 和__FILE__ 宏的代码可能意味着这些值的字符串文字将在最终可执行文件中的某个位置。这适用于代码中的所有其他字符串文字——它们会在某个地方。

除此之外,在最终的 dll/exe 中不会有太多关于原始代码的信息。

【讨论】:

  • 如果您使用旧的 .def 文件方法来指定导出(而不是 __declspec(dllexport),您仍然可以按序号连同 NONAME 一起导出,甚至不导出名称。
【解决方案2】:

要在 Windows COFF 格式构建的 DLL、EXE、LIB 或 OBJ 文件中查找符号,请使用 dumpbin.exe 实用程序,它通常包含在 SDK 或 WDK 中,或随 VC++ 提供

参考:https://docs.microsoft.com/en-us/cpp/build/reference/dumpbin-reference

例如,在简单的 exe 上使用 /ALL 选项运行它会在 .exe 中生成要从 DLL 解析的符号列表。在 DLL 上运行它会生成 DLL 导出的符号列表。

MSVCP140.dll
140003080 导入地址表
140003AD0 导入名称表
0 时间日期戳
0 第一个转发器参考索引

                 103 ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@M@Z                         
                 10C ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_K@Z                        
                 10D ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_N@Z                        
                 4C5 ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z                          
                 368 ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ                      
                 244 ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ                            
                 4DE ?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAHD@Z                         
                 4E1 ?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEBD_J@Z                   
                 2B4 ?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A                               
                 51F ?uncaught_exceptions@std@@YAHXZ                                                        

VCRUNTIME140.dll
1400030D8 导入地址表
140003B28 导入名称表
0 时间日期戳
0 第一个转发器参考索引

                  3E memset                                                                                 
                   8 __C_specific_handler                                                                   
                  23 __std_terminate                                                                        
                   E __CxxFrameHandler3                                                                     

【讨论】:

  • 非常有用的工具,谢谢。 :) 虽然 /ALL 选项只是转储和无尽的流,看起来像一个十六进制视图,左边是十六进制,右边是 ASCII。
  • @ruhigbrauner 很好,/HEADERS 可能更适合你
猜你喜欢
  • 2017-07-29
  • 1970-01-01
  • 2013-11-28
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2016-02-07
  • 2011-04-14
相关资源
最近更新 更多