VS 编译的二进制文件中的符号
Symbols in VS-compiled Binaries
我有以下问题:
是否可以在 Visual Studio 编译的 C++ 二进制文件中找到符号,或者符号是否只存储在 .pdb 或 .map 文件中?如果可以在二进制文件中找到它们,哪些设置决定符号是否存储在那里?
或者换句话说:二进制文件是否可能包含源代码的任何部分,无论是成员、函数还是其他任何部分。
谢谢
您可以在构建时选择是否将调试信息嵌入到库中而不是 pdb - 请参阅 Debug Information Format 中的 /Z7。因此,如果您发布 .libs 或 .objs,这可能是个问题。当创建最终 exe/dll 时,此信息将不存在 - 它将被放入 PDB 中。
DLL 导出的函数和变量将被命名,以便调用者可以找到它们。
使用 __FUNCTION__
和 __FILE__
宏的代码可能意味着这些值的字符串文字将位于最终可执行文件中的某个位置。这适用于代码中的所有其他字符串文字 - 它们将在某处。
除此之外,在最终的dll/exe中不会有太多关于原始代码的信息。
要查找以 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 进口地址Table
140003AD0 导入名称 Table
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 导入地址 Table
140003B28 导入名称 Table
0 时间日期戳
0 第一个转发器引用的索引
3E memset
8 __C_specific_handler
23 __std_terminate
E __CxxFrameHandler3
我有以下问题: 是否可以在 Visual Studio 编译的 C++ 二进制文件中找到符号,或者符号是否只存储在 .pdb 或 .map 文件中?如果可以在二进制文件中找到它们,哪些设置决定符号是否存储在那里?
或者换句话说:二进制文件是否可能包含源代码的任何部分,无论是成员、函数还是其他任何部分。
谢谢
您可以在构建时选择是否将调试信息嵌入到库中而不是 pdb - 请参阅 Debug Information Format 中的 /Z7。因此,如果您发布 .libs 或 .objs,这可能是个问题。当创建最终 exe/dll 时,此信息将不存在 - 它将被放入 PDB 中。
DLL 导出的函数和变量将被命名,以便调用者可以找到它们。
使用 __FUNCTION__
和 __FILE__
宏的代码可能意味着这些值的字符串文字将位于最终可执行文件中的某个位置。这适用于代码中的所有其他字符串文字 - 它们将在某处。
除此之外,在最终的dll/exe中不会有太多关于原始代码的信息。
要查找以 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 进口地址Table
140003AD0 导入名称 Table
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 导入地址 Table
140003B28 导入名称 Table
0 时间日期戳
0 第一个转发器引用的索引
3E memset
8 __C_specific_handler
23 __std_terminate
E __CxxFrameHandler3