2010-07-15 20 views
6

J'espère charger LoadLibrary sur une DLL C++ non managée avec du code managé, puis appeler GetProcAddress sur les fonctions externes qui ont été tronquées. Ma question est de savoir si les noms corrompus d'un compilateur C++ sont déterministes? C'est-à-dire: Le nom sera-t-il toujours converti au même nom mutilé, si la signature de l'original n'a pas changé?Est-ce que le nom C++ mangling (decoration) est déterministe?

+0

double possible de [Quel est le nom mutiler, et comment fonctionne-t-il?] (Http://stackoverflow.com/questions/1314743/what-is-name-mangling- et-how-does-it-work) –

+1

En tant que version de Revs du compilateur, il peut changer la façon dont il nomme mangling. Donc, tant que vous vous en tenez à un compilateur spécifique et une version spécifique, vous devriez être OK. Notez que certains compilateurs fournissent dans l'exécution une API qui vous permet de convertir en <--> à partir de noms tronqués. Vous pouvez regarder comment fonctionne C++ filt pour en savoir plus sur les bibliothèques gcc mangling. –

+0

@Martin. C'est une bonne information. Je suis confiné aux plateformes Windows. Cela me dit que je dois me préparer à casser les changements ou à trouver un autre moyen. – Blanthor

Répondre

6

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

Si vous utilisez GetProcAddress, il serait beaucoup plus propre d'exporter les fonctions comme extern "C" afin que leurs noms ne soient pas mutilés.

+4

Une version particulière d'un compilateur modifiera les noms de façon cohérente, sinon il ne pourra pas se lier avec les choses qu'il a produites. A part ça, tous les paris sont désactivés. – Eltariel

0

Le mangeage de noms est géré différemment par chaque compilateur (peut-être ou non - il n'y a pas de standard). Si vous utilisez des fonctions C pur dans votre code C++, vous pouvez utiliser l'extern "C" pour supprimer le mangeage des noms pour les fonctions C afin que le compilateur puisse les trouver.

2

C'est spécifique au compilateur, comme d'autres l'ont dit. Cependant, vous trouverez tous les détails dans un document par Agner Fog ...

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

Voir le point 5 sur cette page.

En outre, ces jours-ci, il existe des bibliothèques qui peuvent gérer mangling et démêlage pour les compilateurs communs pour vous. Pour Visual C++, le point de départ serait les bibliothèques dbghelp et imagehlp.

http://msdn.microsoft.com/en-us/library/ms679292%28v=VS.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms680321%28v=VS.85%29.aspx