Является ли искажение имени C++ (украшение) детерминированным?
-
16-09-2020 - |
Вопрос
Я надеюсь загрузить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, чтобы компилятор мог их найти.