2013-12-10 17 views
10

Ich bin gespannt, warum die Prozedur Verknüpfungstabelle existiert. Welchen Zweck erfüllt es? Konnte die Assembly die globale Offset-Tabelle nicht direkt aufrufen? Welchen Vorteil hat das Aufrufen des PLT beim Aufruf der Global Offset Table?Was ist der Zweck der Prozedur Verknüpfungstabelle?

Der gesamte Prozess ist immer noch irgendwie verwirrend für mich und ich versuche herauszufinden, die Ein- und Ausgänge der dynamischen Verknüpfung, so dass jede Hilfe geschätzt werden würde.

+0

mögliche Duplikate von [Prozessverknüpfungstabelle und globale Versatztabelle] (http://stackoverflow.com/questions/9688076/process-linkage-table-and-global-offset-table) –

+1

Diese Frage beantwortet meine Frage nicht überhaupt – Rell3oT

Antwort

9

Für Anrufe aus PIC-Code, Sie sind richtig, dass die PLT nicht wirklich benötigt wird. Der Compiler konnte einfach eine GOT-Suche und einen indirekten Aufruf an die von der GOT erhaltene Adresse erzeugen. Die Verwendung eines PLT macht den Code jedoch etwas effizienter (zumindest weniger Größe pro Anruf), so dass er im Allgemeinen trotzdem verwendet wird.

Wo die PLT unbedingt benötigt wird, ist jedoch in Nicht-PIC-Code, der dynamisch verknüpft ist. (Normalerweise geschieht dies nur im Hauptprogramm; bei vielen Archs ist Nicht-PIC-Code in gemeinsamen Bibliotheken nicht einmal erlaubt/unterstützt.) Wenn der Compiler Nicht-PIC-Code für einen Funktionsaufruf erzeugt, kann er nicht wissen, dass Die tatsächliche Zieladresse wird zur Laufzeit über den GOT dynamisch aufgelöst. Es erzeugt also nur eine gewöhnliche Aufrufanweisung. Der Linker ist dann verantwortlich, wenn er eine Umlagerung vom Anruftyp für ein Symbol sieht, das nicht lokal aufgelöst wird und eine Laufzeitverknüpfung benötigt, um einen PLT-Eintrag zu erzeugen, der die Adresse von dem GOT lädt und einen indirekten Sprung dorthin macht. Auf diese Weise funktioniert der ursprüngliche Nicht-PIC-Funktionsaufrufcode unverändert.

+0

Großartig! Eine letzte Frage. Was hätte der GOT im PIC-Code anders zu tun, wenn es keinen PLT gäbe? Genauer gesagt ... Warum sollte es aufgeblähter sein? – Rell3oT

+0

Solange es den PLT durchläuft, sieht ein Anruf vom PIC-Code normalerweise identisch mit einem Anruf von Nicht-PIC-Code aus, d. H. Einem einzelnen PC-relativen Anrufbefehl. (Es kann zusätzliche Anforderungen haben, dass das GOT-Register bereits geladen wird; dies ist jedoch bogenspezifisch.) Ein Anruf über den GOT ohne Verwendung des PLT wäre derselbe wie das Einzeichnen des Codes, der normalerweise in dem PLT-Eintrag ist 2-3 Anweisungen, um die tatsächliche Funktionsadresse zu laden und zu ihr zu springen. –

+0

Okay, das habe ich mir gedacht. Ich denke, die Masse wäre ziemlich groß, wenn viele verschiedene Funktionen aufgerufen werden, so dass es schön ist, zwei verschiedene "Ebenen" von Anrufen zum besseren Verständnis zu haben. Danke – Rell3oT