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.
mögliche Duplikate von [Prozessverknüpfungstabelle und globale Versatztabelle] (http://stackoverflow.com/questions/9688076/process-linkage-table-and-global-offset-table) –
Diese Frage beantwortet meine Frage nicht überhaupt – Rell3oT