Was ist eine Symboltabelle?

88

Kann jemand beschreiben, was eine Symboltabelle im Kontext von C und C ++ ist?

jdt141
quelle

Antworten:

81

Hier gibt es zwei gemeinsame und verwandte Bedeutungen von Symboltabellen.

Erstens gibt es die Symboltabelle in Ihren Objektdateien. Normalerweise kompiliert ein C- oder C ++ - Compiler eine einzelne Quelldatei in eine Objektdatei mit der Erweiterung .obj oder .o. Diese enthält eine Sammlung von ausführbarem Code und Daten, die der Linker in eine funktionierende Anwendung oder gemeinsam genutzte Bibliothek verarbeiten kann. Die Objektdatei enthält eine Datenstruktur, die als Symboltabelle bezeichnet wird und die verschiedenen Elemente in der Objektdatei Namen zuordnet, die der Linker verstehen kann. Wenn Sie eine Funktion aus Ihrem Code aufrufen, fügt der Compiler die endgültige Adresse der Routine nicht in die Objektdatei ein. Stattdessen wird ein Platzhalterwert in den Code eingefügt und eine Notiz hinzugefügt, die den Linker anweist, die Referenz in den verschiedenen Symboltabellen aus allen von ihm verarbeiteten Objektdateien nachzuschlagen und den endgültigen Speicherort dort festzuhalten.

Zweitens gibt es auch die Symboltabelle in einer gemeinsam genutzten Bibliothek oder DLL. Dies wird vom Linker erstellt und dient dazu, alle Funktionen und Datenelemente zu benennen, die für Benutzer der Bibliothek sichtbar sind. Auf diese Weise kann das System zur Laufzeit eine Verknüpfung herstellen und offene Verweise auf diese Namen an dem Ort auflösen, an dem die Bibliothek in den Speicher geladen wird.

Wenn Sie mehr erfahren möchten, empfehle ich John Levines ausgezeichnetes Buch "Linkers and Loaders". Link Text

Ben Combee
quelle
Hallo Ben, im zweiten Fall beziehen Sie sich auf die Exporttabelle? Ist die Exporttabelle ein Sonderfall der Symboltabelle? Oder sind das nicht verwandte Konzepte?
Pooven
Hallo. Ich glaube, es ist in keiner Objektdatei, sondern von ihnen verwiesen. Zweitens, könnten Sie bitte etwas näher erläutern, was Sie unter "endgültiger Standort" verstanden haben? Physische Adresse oder endgültige relative Adresse im Quellcode.
stdout
Erwähnen Sie in der Sekunde einen Verweis auf den Zweig oder die Aufruftabelle?
Nikos
26

Kurz gesagt handelt es sich um die Zuordnung des Namens, den Sie seiner Adresse im Speicher zuweisen, einschließlich Metadaten wie Typ, Bereich und Größe. Es wird vom Compiler verwendet.

Das ist im Allgemeinen nicht nur C [++] *. Technisch gesehen enthält es nicht immer die direkte Speicheradresse. Dies hängt davon ab, auf welche Sprache, Plattform usw. der Compiler abzielt.

Steve Landey
quelle
Ich denke, es war sehr wichtig, dass Sie den Inhalt der Adresse mit den Worten "Es enthält nicht immer die direkte Speicheradresse" erwähnen.
Stdout
13

Unter Linux können Sie den folgenden Befehl verwenden:

nm [Objektdatei]

um die Symboltabelle dieser Objektdatei aufzulisten. Aus diesem Ausdruck können Sie dann die verwendeten Linkersymbole aus ihren verstümmelten Namen entschlüsseln .

ZeHolyQofPower
quelle
8

Die Symboltabelle ist die Liste der "Symbole" in einem Programm / einer Einheit. Symbole sind meistens die Namen von Variablen oder Funktionen. Die Symboltabelle kann verwendet werden, um zu bestimmen, wo sich Variablen oder Funktionen im Speicher befinden.

Joe Schneider
quelle
0

Die Symboltabelle ist eine wichtige Datenstruktur, die von Compilern erstellt und verwaltet wird, um Informationen über das Auftreten verschiedener Entitäten wie Variablennamen, Funktionsnamen, Objekte, Klassen, Schnittstellen usw. zu speichern.

Hautausschläge
quelle
Linker und Assembler beschäftigen sich auch mit Symboltabellen (oft einfacher als die Compilertabellen).
Basile Starynkevitch