visual studio 2010 — искажение 64-битного имени для переполнения стека

У меня есть немного кода, который имеет следующую строку

  #pragma comment(linker, "/include:_test@12")

Проект, который использует этот код, работает нормально, когда я компилирую код с использованием C ++ Visual Studio 2010 с типом конфигурации 32 бита (я также на 32-битной машине Windows).

Я получаю ошибку ссылки, когда меняю машину на 64-битную и использую конфигурацию x64, которая компилируется с C ++ Visual Studio 2010.

Отличается ли название C ++ от 32-битного или 64-битного? Если это так, где я могу найти 64-битные соглашения по каллиграфии имен C ++?

6

Решение

Да, искажение имени отличается от 32 до 64 бит. Разумная статья о точных форматах может быть нашел здесь. Вы можете заметить основные различия довольно быстро, однако, просто купите компиляцию для обеих целей и изучите полученные файлы карт. Из моего опыта они почти идентичный (64-битный добавляет небольшой элемент данных, потенциально изменяет другие).

Простой пример: void foo();

32bit: ?foo@A@@QAEXXZ
64bit: ?foo@A@@QEAAXXZ

Для не искаженного вызова std суффикс длины может существенно отличаться в зависимости от использования стека параметров. 64-битные настройки по умолчанию для VC ++ не ставят подчеркивания и не кодируют суффиксы длины. Следующее было скомпилировано как 32/64-битными конфигами с чистыми настройками:

extern "C" int _stdcall func2(int, int, char*);

32bit: _func2@12
64bit: func2

Там нет особого смысла.

Завершая схему, unmagled _cdecl, который делает это:

extern "C" int _cdecl func2(int, int, char*);

32bit: _func2
64bit: func2

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

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]