Является ли искажение имени C++ (украшение) детерминированным?

StackOverflow https://stackoverflow.com/questions/3252909

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Кроме того, в наши дни есть библиотеки, которые могут обрабатывать потрясение и отключение для вас общего компилятора.Для Visual C ++ отправная точка будет библиотеками DBGHELP и ImageHLP.

http://msdn.microsoft.com / ru-us / библиотека / ms679292% 28v= vs.85% 29.aspx

http://msdn.microsoft.com / ru-us / Библиотека / ms680321% 28v= vs.85% 29.aspx

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top