2009-07-24 6 views

Antwort

5

Nun, jetzt, wo Sie Unix nm erwähnen, kann ich die Symbolauflösung feststellen.

Ausführbare Dateien können sich auf Entitäten beziehen, die nicht in ihnen selbst definiert sind. Zum Beispiel Variablen oder Prozeduren in Shared Libraries. Diese Entitäten werden durch externe Symbole identifiziert. Die ausführbare Datei könnte auch interne Symbole enthalten, auf die externe Dateien verweisen können - wie es natürlich bei Bibliotheken der Fall ist.

Die Symbolauflösung in diesem Kontext ist, sobald ein Programm in den Speicher geladen wurde, die Zuweisung von korrekten Adressen zu allen externen Entitäten, auf die es sich bezieht. Dies bedeutet, dass jede Position im geladenen Programm geändert wird, wenn ein Verweis auf ein externes Symbol erstellt wurde.

Diese Adressen hängen davon ab, wo im Speicher der Code mit den externen Symbolen geladen wurde.

In Unix ist der Standard-Kompilierungsmodus für Programme die Verwendung der System-Shared-Library, anstatt alles, was in der ausführbaren Datei erforderlich ist, vorab zu verknüpfen. Wenn Sie beispielsweise ein Programm mit gcc kompilieren, übergeben Sie das Flag -static, wenn Sie möchten, dass es statisch kompiliert wird, anstatt nicht aufgelöste symbolische Referenzen zu haben.

Suchen Sie nach "shared libraries" für weitere Informationen.

+0

Das macht Sinn, ich danke Ihnen sehr. Ich werde auch "shared libraries" nachschlagen. Hast du irgendwelche Bücher, die du empfehlen kannst, um mehr darüber zu erfahren? –

+1

Das beste Buch, das ich über das Thema weiß, ist [_Linkers and Loaders_ von John R. Levine] (http://rads.stackoverflow.com/amzn/click/1558604960). – alanc

1

Ich bin nicht sicher, welchen Kontext Sie Symbolauflösung in bedeuten. Aber es erinnert mich an dlopen (3) und dlsym (3) für die Laufzeit-Symbolauflösung in gemeinsam genutzten Bibliotheken.

+0

Ich meine es im Kontext der Verwendung mit dem Befehl nm unter Unix. Hilft das? Ich bin mir nicht sicher, was dlopen ist, also kann ich nicht sagen, ob du in der Nähe bist. –

1

Wie bereits erwähnt, kann es sich auf die Laufzeit- oder Link-Zeit-Symbolauflösung beziehen. Sie sollten jedoch nicht vergessen, Kompilierung-Zeit-Symbol-Auflösung.

Dies sind die Regeln, die eine Sprache verwendet, um Symbole "Dingen" zuzuordnen. Symbole sind nur etwas, das wie ein Name aussieht (lokal, Mitglieder und globale Variablen, Funktionen, Methoden, Typen, etc.) und "Dinge" sind die Compiler, die verstehen, worauf sich der Name bezieht.

Die Regeln dafür können ziemlich einfach sein (zum Beispiel IIRC in C ist es etwas mehr als eine geordnete Liste von Orten zu suchen) oder komplex (C++ hat alle Arten von Fällen mit Überladung, Vorlagen und whatnot). Im Allgemeinen wirken diese Regeln mit der Semantik des Programms und manchmal können sie sogar in (potentiell) Mehrdeutigkeiten führen:

C++:

int First(int i) { return i; } 
float First(float f) { return f; } 

void Second(int (*fn)(int)) { printf("int"); } 
void Second(float (*fn)(float); { printf("float"); } 

... 

Second(&First); // What will be printed?