2010-07-15 8 views
6

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

+0

возможно дубликат [Что такое имя коверкание, и как это работает?] (Http://stackoverflow.com/questions/1314743/what-is-name-mangling- and-how-do-it-work) –

+1

Как версия версии для компилятора, она может измениться, как она называется mangling. Поэтому, пока вы придерживаетесь определенного компилятора и конкретной версии, вы должны быть в порядке. Обратите внимание, что какой-то компилятор предоставляет там runtime API, который позволяет вам конвертировать в <--> из искалеченных имен. Вы можете посмотреть, как работает C++ filter, чтобы узнать о библиотеках gcc mangling. –

+0

@Martin. Это отличная информация. Я ограничен платформами Windows. Это говорит мне, что мне нужно подготовиться к нарушению изменений или найти другой путь. – Blanthor

ответ

6

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

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

+4

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

0

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

2

Это специальный компилятор, как говорили другие. Тем не менее, вы можете найти подробную информацию в документе по Agner туман ...

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

 Смежные вопросы

  • Нет связанных вопросов^_^