2010-07-15 4 views
6

Ich hoffe, LoadLibrary in einer nicht verwalteten C++ - DLL mit verwaltetem Code, und rufen Sie dann GetProcAddress auf extern Funktionen, die gemangelt wurden. Meine Frage ist, sind die verstümmelten Namen, die Sie von einem C++ - Compiler bekommen, deterministisch? Das heißt: Wird der Name immer durch den gleichen verfälschten Namen umgewandelt, wenn sich die Signatur des Originals nicht geändert hat?Ist C++ Name Mangling (Dekoration) deterministisch?

+0

möglich Duplikat [Was Name Mangeln ist, und wie funktioniert es?] (Http://stackoverflow.com/questions/1314743/what-is-name-mangling- and-how-does-it-work) –

+1

Wenn der Compiler die Version aktualisiert, kann sich die Namensänderung ändern. Solange Sie bei einem bestimmten Compiler und einer bestimmten Version bleiben, sollten Sie in Ordnung sein. Beachten Sie, dass einige Compiler in der Runtime eine API zur Verfügung stellen, mit der Sie aus verfälschten Namen in <--> konvertieren können. Sie können sich ansehen, wie C++ filt funktioniert, um gcc-Mangling-Bibliotheken zu finden. –

+0

@Martin. Das sind großartige Informationen. Ich bin auf die Windows-Plattformen beschränkt. Das sagt mir, dass ich mich darauf vorbereiten muss, Veränderungen zu brechen oder einen anderen Weg zu finden. – Blanthor

Antwort

6

Es ist nicht durch den Standard spezifiziert, und hat nach meiner Erfahrung sicherlich zwischen Versionen des gleichen Compilers geändert, obwohl es über einige feste Umstände deterministisch sein muss, weil es sonst keine Möglichkeit geben würde, zwei zu verbinden separat kompilierte Module.

Wenn Sie GetProcAddress verwenden, wäre es viel sauberer, die Funktionen wie extern "C" zu exportieren, damit ihre Namen nicht verstümmelt werden.

+4

Eine bestimmte Version eines Compilers wird Namen konsistent verfälschen, sonst wäre es nicht in der Lage, mit den produzierten Dingen zu verlinken. Ansonsten sind alle Wetten deaktiviert. – Eltariel

0

Name Mangelung wird von jedem Compiler unterschiedlich gehandhabt (vielleicht oder nicht - es gibt keinen Standard). Wenn Sie reine C-Funktionen in Ihrem C++ - Code verwenden, können Sie das externe "C" verwenden, um die Namensüberfüllung für die C-Funktionen zu unterdrücken, damit der Compiler sie finden kann.

2

Es ist Compiler-spezifisch, wie andere gesagt haben. Sie können jedoch Einzelheiten in einem Dokument von Agner Fog finden ...

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

Siehe Punkt 5 auf dieser Seite.

Auch heutzutage gibt es Bibliotheken, die Mangling und Demangling für gängige Compiler für Sie erledigen können. Für Visual C++ wäre der Ausgangspunkt die Bibliotheken dbghelp und 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