Question

J'espère charger une bibliothèque sur une DLL C++ non gérée avec du code géré, puis appeler GetProcAddress sur des fonctions externes qui ont été mutilées.Ma question est la suivante : les noms mutilés que vous obtenez d'un compilateur C++ sont-ils déterministes ?C'est-à-dire:Le nom sera-t-il toujours converti en le même nom mutilé, si la signature de l'original n'a pas changé ?

Était-ce utile?

La solution

Il n'est pas spécifié par la norme et a certainement changé entre les versions du même compilateur d'après mon expérience, bien qu'il doive être déterministe dans un ensemble de circonstances fixes, car sinon il n'y aurait aucun moyen de lier deux modules compilés séparément.

Si vous utilisez GetProcAddress, il serait bien plus propre d'exporter les fonctions sous forme extern "C" donc leurs noms ne sont pas mutilés.

Autres conseils

C'est spécifique au compilateur, car d'autres l'ont dit.Cependant, vous pouvez trouver des détails dans un document de Agner BOG ...

http://www.agner.org/optimize/#manuels

Voir l'élément 5 sur cette page.

De plus, ces jours-ci, il existe des bibliothèques pouvant gérer des ganglions et des élanges pour vous pour vous.Pour Visual C ++, le point de départ serait les bibliothèques DBGHELP et ImageHLP.

http://msdn.microsoft.com / fr-US / bibliothèque / ms679292% 28v= vs.85% 29.aspx

http://msdn.microsoft.com / fr-US / bibliothèque / ms680321% 28v= vs.85% 29.aspx

Nom Mangeling est traité différemment par chaque compilateur (peut-être ou pas - il n'y a pas de norme).Si vous utilisez des fonctions Pure C dans votre code C ++, vous pouvez utiliser l'extérieur «C» sur Suppr Name Mangeling pour les fonctions C afin que le compilateur puisse les trouver.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top