A confusão de nomes em C++ (decoração) é determinística?
-
16-09-2020 - |
Pergunta
Espero LoadLibrary em uma DLL C++ não gerenciada com código gerenciado e, em seguida, chamar GetProcAddress em funções externas que foram mutiladas.Minha pergunta é: os nomes distorcidos que você obtém de um compilador C++ são determinísticos?Aquilo é:O nome será sempre convertido para o mesmo nome mutilado, se a assinatura do original não tiver mudado?
Solução
Não é especificado pelo padrão e certamente mudou entre versões do mesmo compilador na minha experiência, embora deva ser determinístico em relação a algum conjunto fixo de circunstâncias, porque caso contrário não haveria como vincular dois módulos compilados separadamente.
Se você estiver usando GetProcAddress
, seria muito mais limpo exportar as funções como extern "C"
então seus nomes não são mutilados.
Outras dicas
É compilador específico, como outros disseram.No entanto, você pode encontrar detalhes em um documento por agner nevoeiro ...
http://www.agner.org/optimize/#manuals
.ver item 5 nessa página.
Além disso, estes dias, há bibliotecas que podem lidar com mutegas e desmantelantes para compiladores comuns para você.Para o Visual C ++, o ponto de partida seria as bibliotecas DBGHELP e ImageHlp.
http://msdn.microsoft.com / pt-us / biblioteca / MS679292% 28V= vs.85% 29.aspx
http://msdn.microsoft.com / pt-us / biblioteca / MS680321% 28V= vs.85% 29.aspx
Nome Mangeling é tratado de forma diferente por cada compilador (talvez ou não - não há padrão).Se você usar funções C puras no código C ++, poderá usar o externo "C" para suprimir o mangeling para as funções C para que o compilador seja capaz de encontrá-los.