我有以下问题: 是否可以在Visual Studio编译的C ++二进制文件中找到符号,或者只是存储在.pdb或.map文件中的符号?如果可以在二进制文件中找到它们,那么哪些设置可以确定符号是否存储在那里?
或者换句话说:二进制文件是否可以包含源代码的任何部分,无论是成员,函数还是其他任何部分。
由于
答案 0 :(得分:1)
您可以选择何时构建是否将调试信息嵌入库而不是pdb - 请参阅Debug Information Format中的/ Z7。因此,如果您运送.libs或.objs,这可能是一个问题。当创建最终的exe / dll但是这些信息不会存在 - 它将被放入PDB。
将导出DLL导出的函数和变量,以便调用者可以找到它们。
使用__FUNCTION__
和__FILE__
宏的代码可能意味着这些值的字符串文字将位于最终可执行文件中的某个位置。这适用于代码中的所有其他字符串文字 - 它们将存在于某处。
除此之外,关于最终dll / exe中原始代码的信息不多。
答案 1 :(得分:1)
要在以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