Что означает числовая часть искаженного имени для анонимной переменной пространства имен, сгенерированной в Visual Studio? - PullRequest
0 голосов
/ 18 июня 2019

Я перекомпилирую бинарный файл 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 на том же ПК, у меня нет этой разницы.

Итак, вопросы: Что означает эта шестнадцатеричная часть в искаженном имени? Почему эта часть шестнадцатеричного числа отличается в некоторых случаях? Как я могу скомпилировать этот проект, чтобы эти имена были одинаковыми.

1 Ответ

1 голос
/ 18 июня 2019

Анонимные пространства имен по-прежнему уникальны.У каждого разные.Таким образом, внутренне им все еще нужно имя.

Похоже, это способ его автоматического генерирования, предположительно со случайным числом (в шестнадцатеричной записи).

Вам придется прекратить полагатьсяна эти имена являются детерминированными.Вы могли бы искать ?A, а затем игнорировать последующее шестнадцатеричное число при сравнении оформленных имен анонимных пространств имен.

Однако это может привести к ложным срабатываниям, в зависимости от того, что вы делаете, потому что два пространства именможет буквально быть в разных местах в первоисточнике.Там нет реального способа узнать.

...