Dies wird durch die Namensmanipulation von C++ verursacht. Von Wikipedia :
Die ersten C++-Compiler waren als Übersetzer für C-Quellcode implementiert Code implementiert, der dann von einem einem C-Compiler in Objektcode kompiliert wurde; deshalb mussten die Symbolnamen den C-Bezeichnungsregeln C-Bezeichner-Regeln entsprechen. Noch später, mit dem Aufkommen von Compilern, die Maschinencode oder Assembler direkt erzeugten, unterstützte der Linker des Systems im Allgemeinen keine C++-Symbole unterstützt, und das Mangling war weiterhin erforderlich.
In Bezug auf Kompatibilität :
Um Compiler-Anbietern die Möglichkeit zu geben größere Freiheit zu geben, hat das C++-Standardisierungs Ausschuss beschlossen, die Implementierung Implementierung der Namensumwandlung vorzuschreiben, Ausnahmebehandlung und andere implementierungsspezifischen Funktionen vorzuschreiben. Die Nachteil dieser Entscheidung ist, dass Objektcode, der von verschiedenen Compilern erzeugter Objektcode voraussichtlich inkompatibel ist. Es gibt jedoch Standards von Drittanbietern für bestimmte Maschinen oder Betriebssysteme, die versuchen, Compiler für diese Plattformen zu standardisieren diese Plattformen zu standardisieren (z. B. C++ ABI[18]); einige Compiler übernehmen einen sekundären Standard für diese Elemente.
Von http://www.cs.indiana.edu/~welu/notes/node36.html wird das folgende Beispiel gegeben:
Zum Beispiel für den folgenden C-Code
int foo(double*);
double bar(int, double*);
int foo (double* d)
{
return 1;
}
double bar (int i, double* d)
{
return 0.9;
}
Seine Symboltabelle wäre (durch dump -t
)
[4] 0x18 44 2 1 0 0x2 bar
[5] 0x0 24 2 1 0 0x2 foo
Wenn dieselbe Datei in G++ kompiliert wird, würde die Symboltabelle wie folgt aussehen
[4] 0x0 24 2 1 0 0x2 _Z3fooPd
[5] 0x18 44 2 1 0 0x2 _Z3bariPd
_Z3bariPd
bedeutet eine Funktion, deren Name bar ist und deren erstes Argument eine ganze Zahl und das zweite Argument ein Zeiger auf double ist.