Как вручную украсить имена компоновщика в MSVC 2005?

Есть ли способ вручную украсить имена функций в MS C++? Я предполагаю, что любое решение будет специфичным для Microsoft, и я согласен с этим.

В качестве альтернативы, есть ли способ объявить функцию «??_M@YGXPAXIHP6EX0@Z@Z», чтобы компилятор мог ее понять? К вашему сведению, undname перечисляет это как:

void _ _ stdcall `eh vector destructor iterator'(void * , unsigned int, int, void (_ _thiscall * )(void * ))

Очевидно, компилятору не нравятся апострофы в моих идентификаторах.

EDIT:
Решение было очень простым. Я выполнил obj и отредактировал желаемые декорированные имена прямо над моими именами-заполнителями, дополнив их нулями. Компоновщик съел его сразу, без вопросов. Функции являются заглушками, вызывающими внешние функции, поэтому мне не нужно продолжать шестнадцатеричное редактирование каждый раз, когда я делаю небольшое изменение.

Спасибо за идеи всем.


person zildjohn01    schedule 18.02.2009    source источник
comment
Чего вы пытаетесь добиться этим?   -  person Assaf Lavie    schedule 18.02.2009
comment
Пытаюсь заменить ЭЛТ.   -  person zildjohn01    schedule 18.02.2009
comment
Ну удачи во всем... :)   -  person Assaf Lavie    schedule 19.02.2009


Ответы (4)


Если вы объявляете свою функцию как extern "C" и используете параметр компоновщика, который отключает префикс подчеркивания, имя, которое вы даете в коде, совпадает с именем, которое у вас будет в файле .obj. Но это не решит всех ваших проблем, так как компилятор будет сопротивляться, когда вы попытаетесь объявить функцию со специальными символами в имени.

Я предполагаю, что решение (которое требует много работы, IMO) состоит в том, чтобы дать желаемым функциям уникальные имена в исходном коде (например, PLACEHOLDER_01), а затем заменить их в файле .obj. Вам нужно как-то проанализировать объектный файл и изменить имена символов.

Заметьте также, что "а, итератор векторного деструктора" - это искаженное имя, реальное (символическое) имя не должно содержать апострофов или пробелов. При сбросе .obj/.dll вам придется отключить изменение имен.

person Fabio Ceconello    schedule 18.02.2009

`а, итератор векторного деструктора'

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

В качестве альтернативы, есть ли способ объявить функцию "??_M@YGXPAXIHP6EX0@Z@Z"

Я серьезно сомневаюсь, что вы можете «объявить» искаженное имя, если мы подразумеваем одно и то же под объявлением. Декларация является предварительной компиляцией, искажение происходит намного позже.

??_M@YGXPAXIHP6EX0@Z@Z

Это искаженное имя. Все символы со связью C++ искажены. Это своего рода хэш подписи, типа возвращаемого значения и информации о соглашении о вызовах. Дополнительные сведения см. в MSDN.

person dirkgently    schedule 18.02.2009
comment
Да, апострофы являются частью имени — это специальная функция компилятора с внутренним именем. В других недекорированных именах их нет. Я пробовал всевозможные способы заявить об этом, и не повезло. - person zildjohn01; 18.02.2009

Я предполагаю, что вы знаете, что такое итератор векторного деструктора, и только хотите знать, как имитировать его имя в вашем коде.

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

Другим способом может быть помещение вашего кода в DLL и переопределение имени в файле *.def вашей DLL с использованием необязательного синтаксиса entryname[=internalname], который разрешен в раздел EXPORTS файла *.def (который позволяет вам переименовывать то, что экспортируется).

person ChrisW    schedule 18.02.2009

Вы можете сгенерировать этот символ с помощью MSVC++ с этой подписью:

void __stdcall __ehvec_dtor(void * __arr, unsigned int __size, int _n, void (_stdcall * __dtor)(void *))

По-видимому, __ehvec_dtor сопоставляется со специальным искаженным символом для деструктора вектора обработки исключений.

person skanev    schedule 13.09.2013