Является ли C ++ имя искажения (украшения) детерминистическим? - PullRequest
6 голосов
/ 15 июля 2010

Я надеюсь загрузить LoadLibrary на неуправляемую C ++ DLL с управляемым кодом, а затем вызвать GetProcAddress для внешних функций, которые были искажены.Мой вопрос заключается в том, являются ли искаженные имена, которые вы получаете от компилятора C ++, детерминистическими?То есть: будет ли имя всегда преобразовываться в одно и то же искаженное имя, если подпись оригинала не изменилась?

Ответы [ 3 ]

6 голосов
/ 15 июля 2010

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

Если вы используете GetProcAddress, было бы намного понятнее экспортировать функции как extern "C", чтобы их имена не были искажены.

2 голосов
/ 15 июля 2010

Это зависит от компилятора, как говорили другие.Тем не менее, вы можете найти подробности в документе Агнера Фог ...

http://www.agner.org/optimize/#manuals

См. Пункт 5 на этой странице.

Кроме того, в наши дни существуютбиблиотеки, которые могут обрабатывать искажения и разборки для обычных для вас компиляторов.Для Visual C ++ отправной точкой будут библиотеки dbghelp и imagehlp.

http://msdn.microsoft.com/en-us/library/ms679292%28v=VS.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms680321%28v=VS.85%29.aspx

0 голосов
/ 15 июля 2010

Управление именами обрабатывается каждым компилятором по-разному (может быть, или нет - стандарта нет).Если вы используете чистые функции C в своем коде C ++, вы можете использовать extern «C» для подавления управления именами для функций C, чтобы компилятор мог их найти.

...