Я надеюсь, что LoadLibrary на неуправляемой DLL на C++ с управляемым кодом, а затем вызовите GetProcAddress на функции extern, которые были искалечены. Мой вопрос в том, являются ли искаженные имена, которые вы получаете от компилятора C++, детерминированного? То есть: будет ли имя всегда преобразовываться в одно и то же поврежденное имя, если подпись оригинала не изменилась?Является ли C++ имя mangling (украшение) детерминированным?
ответ
Он не указан стандартом и, безусловно, изменился между версиями одного и того же компилятора в моем опыте, хотя он должен быть детерминированным по некоторым фиксированным обстоятельствам, поскольку в противном случае не было бы способа связывать два отдельно скомпилированные модули.
Если вы используете GetProcAddress
, было бы намного проще экспортировать функции как extern "C"
, чтобы их имена не искалечились.
Конкретная версия компилятора будет последовательно манипулировать именами, иначе она не сможет связываться с вещами, которые она произвела. Кроме того, все ставки отключены. – Eltariel
Название mangeling обрабатывается по-разному каждым компилятором (может быть, нет или нет - нет стандарта). Если вы используете чистые C-функции в своем коде на C++, вы можете использовать extern «C», чтобы подавить mangeling для функций C, чтобы компилятор смог их найти.
Это специальный компилятор, как говорили другие. Тем не менее, вы можете найти подробную информацию в документе по 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
возможно дубликат [Что такое имя коверкание, и как это работает?] (Http://stackoverflow.com/questions/1314743/what-is-name-mangling- and-how-do-it-work) –
Как версия версии для компилятора, она может измениться, как она называется mangling. Поэтому, пока вы придерживаетесь определенного компилятора и конкретной версии, вы должны быть в порядке. Обратите внимание, что какой-то компилятор предоставляет там runtime API, который позволяет вам конвертировать в <--> из искалеченных имен. Вы можете посмотреть, как работает C++ filter, чтобы узнать о библиотеках gcc mangling. –
@Martin. Это отличная информация. Я ограничен платформами Windows. Это говорит мне, что мне нужно подготовиться к нарушению изменений или найти другой путь. – Blanthor