2009-07-13 16 views
0

Ich versuche zu lernen, die Details hinter, wie der Compiler funktioniert und ich frage mich, was das Symbol B bedeutet, wenn nm verwendet. Ich habe versucht, std :: cout in libstdc folgen ++, aber es endet mitnm nicht initialisierten Daten Abschnitt

nm -DC /usr/lib/libstdc++.so.6 | grep cout 
000e8da0 B std::cout 
000e9020 B std::wcout 

Wenn der Link auf die eigentliche Funktion ist und was bedeutet das B bedeuten?

Antwort

3

Das bedeutet, das Symbol ist global und in der nicht initialisierten Datenabschnitt (historisch BSS daher das 'B'). Mehr nm Infos hier:

http://linux.die.net/man/1/nm

Wahrscheinlich auch verfügbar, wenn Sie "Mann 1 nm" eingeben.

Und was ist mit der Funktion? Nun, "cout" ist eine Objektinstanz, keine Funktion. Seine Klasse wird in diesem speziellen Fall Funktionen haben, meist Operatorüberladungen.

+0

Also wird cout << "was auch immer" als std :: cout-Objekt instanziiert und ruft dann den std :: operator auf, um es auszudrucken? – victor

+0

std :: cout ist wahrscheinlich ein globales Objekt und wird daher in den globalen Bereich (bss) gestellt. Irgendwo, bevor Ihr Programm 'main' aufgerufen wird, führt die Plattform einen Konstruktor aus und initialisiert std :: cout (und andere globale Variablen). – nos

1

Vom nm Handbuch Seite:

B  The symbol is in the uninitialized data section (known as BSS). 
1

"nicht initialisierte" Daten der Abschnitt BSS, wird tatsächlich von der OS-Loader auf alle Nullen initialisiert. Es nimmt keinen Platz im Bild auf der Festplatte ein, da bekannt ist, dass der Inhalt nur aus Nullen besteht - nur die Größe wird im Bild gespeichert.

Globale Variablen werden normalerweise im BSS-Bereich zugewiesen. Dies ist auch der Grund, warum globale Variablen im Allgemeinen Null initialisiert werden.

Verwandte Themen