2016-12-09 2 views
2
extern int test(); 
int main() 
{ 
    return test(); 
} 

Ich baue den Code von gcc -c -o test.o test.c, und ich finde, es gibt keinen Namen Mangling, wenn ich nm test.o ausführen. nm Ausgänge test aber nicht _test.warum der Name mangling nicht passiert?

Meine Umgebung ist ubuntu 16.04gcc 5.4.0

+0

Während es nicht wirklich _name mangling_ ist, hängt das Hinzufügen eines Unterstrichs zu Funktionsnamen von der verwendeten Werkzeugkette ab. Bei der Entwicklung für C16x-Mikrocontroller habe ich Tools von Keil und Tasking verwendet. Einer fügte ein _ hinzu, während das andere nicht. Selbst für die gleiche CPU-Architektur. Daher müssen Sie die Dokumentation Ihrer Werkzeugkette oder die EABI-Beschreibung Ihrer CPU lesen, wie die Aufrufkonventionen für C-Funktionen sind. – Gerhardh

Antwort

3

Sie scheinen zu erwarten, dass globalen Symbolen eine Unterstreichung vorangestellt wird. Dies ist etwas, das nicht in ELF gemacht wird, welches das Objektformat ist, das Linux verwendet. Ältere Binärformate wie a.out oder coff erforderten das, ELF nicht.

Btw. Der Begriff "Mangling" wird normalerweise für C++ Symbol Mangling verwendet, was eine andere Sache ist.

1

Namen Mangeln in C-Programmen nicht geschieht. Es passiert in C++ - Programmen.

Deshalb können Sie Funktionen in C nicht überladen, aber Sie können in C++.

1

Die main Funktion kehrt nach der Funktion test Der Rückgabewert von test Aufruf wird dann auf den Rückgabewert von main gegeben.

Kein Name Mangling ist erforderlich.