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.
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? –
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