6
votes

Nom C ++ Mangling (décoration) déterministe?

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


4 commentaires

Dupliqué possible de Qu'est-ce que le nom Mangling, et comment ça marche?


En tant que version de compilateur Revs, il peut changer comment il s'appelle Mangling. Ainsi, tant que vous vous en tenez avec un compilateur spécifique et une version spécifique, vous devriez être ok. Remarque Certains compilateur fournissent à l'heure d'exécution d'une API qui vous permet de convertir en noms manqué. Vous pouvez regarder comment C ++ Filt travaille pour en savoir plus sur les bibliothèques de mangling GCC.


@Martin. C'est une grande information. Je suis confiné aux plates-formes Windows. Cela me dit que je dois préparer des changements ou trouver un autre moyen.


Si vous chargez de manière dynamique une DLL et avez besoin de résoudre les symboles manuellement. C'est généralement une bonne idée de fournir une interface C (car il n'y a pas de mangling et l'ABI est défini (sur une base de plate-forme)). La fonction C peut alors renvoyer un pointeur sur un objet d'usine qui vous permet de créer tous les objets C ++ dans la DLL.


3 Réponses :


6
votes

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

Si vous utilisez getProcAddress , il serait très propre d'exporter les fonctions comme extern "c" de sorte que leurs noms ne sont pas mutilés.


1 commentaires

Une version particulière d'un compilateur va mangler des noms de manière cohérente, sinon il ne serait pas capable de lier avec les choses qu'il produisait. Autre que cela, tous les paris sont éteints.



0
votes

Nom Le 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 Suppress Name Mangeling pour les fonctions C afin que le compilateur puisse les trouver.


0 commentaires

2
votes

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.

Également, ces jours-ci, il existe des bibliothèques pouvant gérer la mangling et la défaillance des compilateurs communs 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


0 commentaires