我正在使用相同的源代码重新编译C ++二进制文件。操作系统是Windows Server 2008 R2,编译器是Microsoft Visual Studio 2005。
此后,我运行dumpbin.exe /ALL /DISASM /RAWDATA:NONE
并比较输出。
拆卸没有区别,但匿名名称空间中某些名称的处理方式却有区别。
例如,.cpp文件中的以下定义:
namespace {
TCHAR l_pszSlashes[] = _T("\\/");
}
我可以有以下变化:
?l_pszSlashes@?A0x79ec3b0d@@3PA_WA (wchar_t * `anonymous namespace'::l_pszSlashes)
?l_pszSlashes@?A0xa9cc3791@@3PA_WA (wchar_t * `anonymous namespace'::l_pszSlashes)
仅当我比较新生成的dll和另一台计算机上的旧dll时,才会显示出差异。 如果我在同一台PC上编译该dll,则没有任何区别。
所以问题是: 改名中的这个十六进制数字部分是什么意思?为什么在某些情况下此十六进制数字部分不同?如何编译该项目以使它们具有相同的名称。
答案 0 :(得分:1)
匿名名称空间仍然是唯一的。每个人都不一样。因此,在内部,他们仍然需要一个名称。
这似乎是一种自动生成一个大概是随机数(以十六进制表示)的方法。
您将不得不停止依赖这些名称具有确定性。在比较匿名名称空间的修饰名称时,您可以查找?A
,然后忽略后续的十六进制数字。
但是,这可能会导致误报,这取决于您在做什么,因为这两个名称空间在字面上可能在原始源中的不同位置。没有真正的方法知道。