5

Ich las Effective C++, 3. Auflage und in Punkt 2 (bevorzugen const, Aufzählungen und inlines zu #defines) erwähnt Scott Meyers die Symboltabelle: er erklärt dass #defines möglicherweise nicht in der Symboltabelle erscheint.Symboltabelle durch die C++ erstellt Compiler

Basierend auf der Antwort here, ein bisschen von der reading davon vorgeschlagen, und der Wikipedia Artikel möchte ich die Symboltabelle wie folgt definieren: da nur der Compiler Objektdateien für jede Übersetzungseinheit schafft, müssen wir noch einen Weg Referenzsymbole zwischen den Übersetzungseinheiten. Dazu wird eine Tabelle verwendet, die für jede Objektdatei erstellt wird, so dass Symbole zu einem späteren Zeitpunkt definiert werden können - vom Linker, wenn die ausführbare Datei/Bibliothek aus den Objektdateien erstellt wird. Beim Verknüpfen werden Symbole durch den Linker mit ihren entsprechenden Speicheradressen ersetzt.

Hier ist, was Ich mag gerne wissen:

  • meine Interpretation Ist oben richtig?
  • Nach der Verknüpfung, nachdem die Speicheradressen aufgelöst wurden, glaube ich nicht, dass Symboltabellen erforderlich sind? Das heißt, ich denke, dass die Symboltabelle nicht in der ausführbaren Datei/Bibliothek verfügbar sein wird; Ist das korrekt?
  • Ich vermute, dass die Symboltabelle auch für andere Compiler-Aufgaben nützlich ist? Etwas wie das Identifizieren von Namenskonflikten vielleicht?
  • Die oben beschriebene Symboltabelle ist nicht identisch mit der export table. Im Kontext von Visual C++ definiert die Exporttabelle die Symbole, die außerhalb der Bibliothek explizit als sichtbar deklariert sind. Ich nehme an, in gewissem Sinne ist dies eine Tabelle von Symbolen - aber nicht im Zusammenhang mit der Symboltabelle, auf die Scott sich bezieht.
  • Gibt es noch etwas Interessantes über die Symboltabelle? Das heißt, gibt es zusätzliche Erkenntnisse über Symboltabellen, die ich haben sollte?

Vielen Dank für Ihre Zeit und Ihren Beitrag.

Antwort

5

Symboltabellen existieren beide für den Compiler (und dann fügt der Compiler sogar lokale variable Symbole in sie; selbst die preprocessor hat irgendeine Art von Symboltabellen für #define -d Namen, aber der Präprozessor könnte heute im Compiler sein) und für den Linker. Aber das sind verschiedene Tabellen, die anders organisiert sind.

Die Linker-Symboltabelle ist hauptsächlich für exportierte oder importierte globale Symbole gedacht. Beachten Sie, dass die linker einige relocation durchführt. Beachten Sie, dass sich der Linker unter Windows und Linux (dllimport unter Windows, __attribute__(visibility...) unter Linux) sehr unterschiedlich verhält. Beachten Sie, dass bei dynamischen Bibliotheken einige Verknüpfungen zur Laufzeit auftreten (dynamic loading). Für C++ kann name mangling passieren. Lesen Sie auch über vague linkage & template instantiation & link-time optimization in GCC ...

Lesen Sie auch Levine's book: Linkers and Loaders und z.B. die Wikipage im Format ELF (wird für Objektdateien, DLLs und ausführbare Dateien unter Linux und vielen Unix-Systemen verwendet).

Wenn Sie Zugriff auf ein Linux-System haben, verwenden Sie die Dienstprogramme readelf(1), nm(1) und objdump(1).Lesen Sie auch Drepper's paper: How To Write Shared Libraries (unter Linux)