Linker (computing)

Im Computer, a Linker oder Link Editor ist ein Computer Systemprogramm das braucht einen oder mehrere Objektdateien (erzeugt durch a Compiler oder an Assembler) und kombiniert sie zu einem einzigen ausführbar Datei, Bibliothek Datei oder eine andere "Objekt" -Datei.
Eine einfachere Version, die ihre schreibt Ausgang direkt zu Erinnerung wird genannt Lader, obwohl Wird geladen wird normalerweise als separater Prozess angesehen.[1][2]
Überblick
Computerprogramme bestehen normalerweise aus mehreren Teilen oder Modulen. Diese Teile/Module müssen nicht in einem einzigen enthalten sein Objektdateiund in solchen Fällen beziehen Symbole als Adressen in andere Module, die bei der Ausführung in Speicheradressen zugeordnet werden. In der Regel kann eine Objektdatei drei Arten von Symbolen enthalten:
- definierte "externe" Symbole, manchmal als "öffentlich" oder "Eintrags" -Symbole bezeichnet, die es ermöglichen, von anderen Modulen aufgerufen zu werden.
- undefinierte "externe" Symbole, die auf andere Module verweisen, in denen diese Symbole definiert sind, und
- Lokale Symbole, die intern in der Objektdatei verwendet werden, um sie zu erleichtern Verlegung.
Für die meisten Compiler ist jede Objektdatei das Ergebnis des Kompilierens einer Eingabemittel -Quellcodedatei. Wenn ein Programm mehrere Objektdateien umfasst, kombiniert der Linker diese Dateien zu einem einheitlichen ausführbaren Programm, in dem die Symbole im Laufe der Fall sind.
Linker können Objekte aus einer Sammlung namens a nehmen Bibliothek oder Laufzeitbibliothek. Die meisten Linker enthalten nicht die gesamte Bibliothek in die Ausgabe. Sie enthalten nur die Dateien[Klarstellung erforderlich] auf die andere Objektdateien oder Bibliotheken verwiesen werden. Die Bibliotheksverknüpfung kann daher ein iterativer Prozess sein, wobei einige referenzierte Module erforderlich sind, die zusätzliche Module benötigen, um verknüpft zu werden, und so weiter. Bibliotheken existieren für verschiedene Zwecke, und eine oder mehrere Systembibliotheken sind normalerweise standardmäßig in Verbindung gebracht.
Der Linker kümmert sich auch darum, die Objekte in einem Programm zu ordnen Adressraum. Dies kann beinhalten Umzug Code, der eine spezifische Annahme annimmt Basisadresse in eine andere Basis. Da ein Compiler selten weiß, wo sich ein Objekt befindet, nimmt er häufig einen festen Basisort an (zum Beispiel, Null). Der Verschiebungsmaschinencode kann die Wiederholung absoluter Sprünge, Ladungen und Geschäfte umfassen.
Die ausführbare Ausgabe des Linkers benötigt möglicherweise einen weiteren Verlagerungspass, wenn er schließlich in den Speicher geladen wird (kurz vor der Ausführung). Dieser Pass wird normalerweise weggelassen Hardware- Angebot virtueller Speicher: Jedes Programm wird in seinen eigenen Adressraum gebracht, sodass es keinen Konflikt gibt, auch wenn alle Programme an derselben Basisadresse geladen werden. Dieser Pass kann auch weggelassen werden, wenn die ausführbare Datei a ist Position unabhängig ausführbar.
Auf manchen Unix Varianten wie z. Sintran IIIDer von einem Linker durchgeführte Prozess (Montage -Objektdateien in ein Programm) wurde aufgerufen Wird geladen (Wie beim Laden von ausführbarem Code auf eine Datei).[3] Darüber hinaus übernimmt das gleiche Programm in einigen Betriebssystemen sowohl die Aufgaben des Verknüpfung als auch das Laden eines Programms (Programm (Dynamische Verknüpfung).
Dynamische Verknüpfung
Viele Betriebssystem Umgebungen ermöglichen eine dynamische Verknüpfung, wodurch die Auflösung einiger undefinierter Symbole aufgeschoben wird, bis ein Programm ausgeführt wird. Dies bedeutet, dass der ausführbare Code noch undefinierte Symbole sowie eine Liste von Objekten oder Bibliotheken enthält, die Definitionen dafür enthalten. Das Laden des Programms lädt diese Objekte/Bibliotheken auch und führt eine endgültige Verknüpfung durch.
Dieser Ansatz bietet zwei Vorteile:
- Häufig verwendete Bibliotheken (z. B. die Standard-Systembibliotheken) müssen nur an einem Ort gespeichert werden, nicht in jeder einzelnen ausführbaren Datei dupliziert, um begrenzt zu sein Erinnerung und Scheibe Platz.
- Wenn ein Fehler in einer Bibliotheksfunktion durch Ersetzen der Bibliothek korrigiert wird, profitieren alle Programme dynamisch von der Korrektur nach dem Neustart. Programme, die diese Funktion durch statische Verknüpfung beinhalteten, müssten zuerst neu angelenkt werden.
Es gibt auch Nachteile:
- Bekannt auf dem Fenster Plattform als "Dll Hölle"Eine inkompatible aktualisierte Bibliothek wird ausführbare Ausführungen brechen, die vom Verhalten der vorherigen Version der Bibliothek abhängt, wenn die neuere Version falsch ist rückwärtskompatibel.
- Ein Programm, das zusammen mit den von ihm verwendeten Bibliotheken (z. B. in Bezug Fälle, das Betriebssystem und die Bibliotheken sind Teil von a qualifiziert Umgebung).
Statische Verknüpfung
Die statische Verknüpfung ist das Ergebnis des Linker, der alle im Programm verwendeten Bibliotheksroutinen in das ausführbare Bild kopiert. Dies erfordert möglicherweise mehr Speicherplatz und Speicher als dynamische Verknüpfung, ist jedoch tragbarer, da dies nicht das Vorhandensein der vorhanden ist Bibliothek auf dem System, wo es läuft. Die statische Verknüpfung verhindert auch "DLL Hell", da jedes Programm genau die Versionen von Bibliotheksroutinen enthält, die es benötigt, ohne Konflikt mit anderen Programmen. Für ein Programm, das nur wenige Routinen aus einer Bibliothek verwendet, muss nicht die gesamte Bibliothek installiert werden.
Verlegung
Da der Compiler keine Informationen über das Layout von Objekten in der endgültigen Ausgabe hat, kann er keine kürzeren oder effizienteren Anweisungen nutzen, die eine Anforderung an die Adresse eines anderen Objekts stellen. Auf eine Sprunganweisung kann beispielsweise eine absolute Adresse oder ein Offset vom aktuellen Ort verweisen, und der Versatz kann je nach Abstand zum Ziel mit unterschiedlichen Längen ausgedrückt werden. Durch die erste Erzeugung der konservativsten Anweisung (normalerweise die größte relative oder absolute Variante, abhängig von der Plattform) und Zugabe EntspannungsschlägeEs ist möglich, während des endgültigen Links kürzere oder effizientere Anweisungen zu ersetzen. In Bezug auf Sprungoptimierungen wird dies auch genannt Automatische Sprunggrößen.[4] Dieser Schritt kann erst durchgeführt werden, nachdem alle Eingabefiele gelesen und temporäre Adressen zugewiesen wurden. das Linker Entspannung PASSEN Nachfolgend werden Adressen neu zuzuordnen, was wiederum mehr potenzielle Relaxationen ermöglichen kann. Im Allgemeinen sind die substituierten Sequenzen kürzer, wodurch dieser Prozess bei einer festen Reihenfolge von Objekten immer auf der besten Lösung konvergiert wird. Wenn dies nicht der Fall ist, können Entspannungen in Konflikt geraten und der Linker muss die Vorteile einer der beiden Optionen abwägen.
Während die Unterrichtslockung typischerweise zur Verknüpfungszeit erfolgt, kann die Entspannung des Innenmoduls bereits im Rahmen des Optimierungsprozesses bei stattfinden Kompilierungszeit. In einigen Fällen kann auch eine Entspannung bei auftreten Ladezeit als Teil des Verlagerungsprozesses oder kombiniert mit Dynamische Dead-Code-Eliminierung Techniken.
Verknüpfungsredakteur
In IBM System/360 Mainframe Umgebungen wie OS/360, einschließlich Z/OS für die Z/Architektur Mainframes, diese Art von Programm ist als als bekannt Verknüpfungsredakteur. Wie der Name eine Verknüpfung impliziert Editor Hat die zusätzliche Fähigkeit, die Hinzufügung, Ersatz und/oder Löschung einzelner Programmabschnitte zuzulassen. Betriebssysteme wie OS/360 verfügen über ein Format für ausführbare Lastmodule, die zusätzliche Daten zu den Komponentenabschnitten eines Programms enthalten, sodass ein einzelner Programmabschnitt ersetzt werden kann, und andere Teile des Programms aktualisiert, sodass verlagerbare Adressen und andere Referenzen können vom Verknüpfungseditor als Teil des Prozesses korrigiert werden.
Ein Vorteil davon ist, dass ein Programm gewartet werden kann, ohne alle Zwischenobjektdateien aufbewahren zu müssen oder ohne sich nicht geänderte Programmabschnitte neu kompilieren zu müssen. Es ermöglicht auch Programmaktualisierungen, die in Form kleiner Dateien verteilt werden können (ursprünglich Kartendecks), das nur das zu ersetzende Objektmodul enthält. In solchen Systemen befindet sich der Objektcode in Form und Format von 80-Byte-Stempelkartenbildern, sodass Updates mit diesem Medium in ein System eingeführt werden können. In späteren Releases von OS/360 und in nachfolgenden Systemen enthalten Load-Module zusätzliche Daten zu Versionen von Komponentenmodulen, um einen nachfolgbaren Datensatz von Aktualisierungen zu erstellen. Es ermöglicht auch, eine hinzuzufügen, zu ändern oder zu entfernen Overlay Struktur aus einem bereits verknüpften Lastmodul.
Der Begriff "Linkage-Editor" sollte nicht so ausgelegt werden, dass das Programm wie ein Texteditor in einem benutzerinteraktiven Modus arbeitet. Es ist für die Ausführung des Stapel-Modus vorgesehen, wobei die Bearbeitungsbefehle vom Benutzer in nacheinander organisierten Dateien geliefert werden, wie z. geschlagene Karten, Dasd, oder Magnetbandund Bänder wurden häufig während der ersten Installation des Betriebssystems verwendet.
Verknüpfungsbearbeitung (IBM Nomenklatur) oder Konsolidierung oder Sammlung (ICL Nomenklatur) bezieht sich auf die Verknüpfungsredakteur oder Konsolidator Die verschiedenen Stücke zu einer lockeren Binäranlage kombinieren, während die Belastung und der Umzug in eine absolute Binäre an der Zieladresse normalerweise als separater Schritt angesehen werden.[2]
Gemeinsame Implementierungen
Auf UNIX- und UNIX-ähnlichen Systemen wird der Linker als "LD" bezeichnet. Ursprünge des Namens "LD" sind "Loader" und "Link Editor". Der Begriff "Lader" wurde verwendet, um den Prozess des Ladens externer Symbole aus anderen Programmen während des Verknüpfungsprozesses zu beschreiben.[5]
GNU -Linker
Der GNU -Linker (oder GNU LD) ist der GNU -Projekt's gratis Software Implementierung des UNIX -Befehls LD. GNU LD führt den Linker aus, der eine ausführbare Datei (oder eine Bibliothek) aus Objektdateien erstellt, die während der Zusammenstellung eines Softwareprojekts erstellt wurden. EIN Linker -Skript kann an gnu ld übergeben werden, um eine höhere Kontrolle über den Verknüpfungsprozess auszuüben.[6] Der GNU -Linker ist Teil der Binärversorger GNU (Binutils). Zwei Versionen von LD sind in Binutils bereitgestellt: die traditionelle GNU LD basiert auf bfdund eine "optimierte" Elfenversion genannt Gold.
Die Befehlszeilen- und Linker-Skriptsyntaxe von GNU LD ist die de facto Standard in weiten Teilen der Unix-artig Welt. Das Llvm Linker des Projekts, lld, ist so konzipiert, dass er kompatibel ist,[7] und kann direkt mit dem GNU -Compiler verwendet werden. Ein weiterer Drop-In-Ersatz, Form, ist eine hoch parallelisierte und schnellere Alternative, die auch von GNU-Werkzeugen unterstützt wird.[8]
Siehe auch
- Binärdateideskriptorbibliothek (libbfd)
- System kompilieren und gehen
- Dll Hölle
- Direkte Bindung
- Dynamische Bindung
- Dynamic Dead Code Elimination
- Dynamischer Versand
- Dynamische Bibliothek
- Dynamischer Linker
- Dynamische Belastung
- Dynamische Link Bibliothek
- Externe Variable
- Bibliothek
- Lader
- Name Dekoration
- Vorverknüpfung (Vorbindung)
- Verlegung
- Smart Links
- Statische Bibliothek
- Gold (Linker)
Verweise
- ^ IBM OS Linkage Editor und Loader (PDF). IBM Corporation. 1972. Archiviert (PDF) vom Original am 2020-03-06. Abgerufen 2020-03-07.
- ^ a b Barron, David William (1978) [1971, 1969]. "5.7. Linkage Editoren und Konsolidatoren". Geschrieben bei Universität von Southampton, Southampton, Großbritannien. In Floretin, J. John (Hrsg.). Assembler und Lader. Computermonographien (3 ed.). New York, USA: Elsevier North-Holland Inc. S. 65–66. ISBN 0-444-19462-2. Lccn 78-19961. (xii+100 Seiten)
- ^ BRF-Linker-Benutzerhandbuch. August 1984. ND-60.196.01.
- ^ Salomon, David (Februar 1993) [1992]. "8.2.3 Automatische Sprunggrößen" (PDF). Geschrieben an der California State University, Northridge, Kalifornien, USA. In Chivers, Ian D. (Hrsg.). Assembler und Lader. Ellis Horwood -Serie in Computern und ihren Anwendungen (1. Aufl.). Chicester, West Sussex, Großbritannien: Ellis Horwood Limited / Simon & Schuster International Group. S. 237–238. ISBN 0-13-052564-2. Archiviert (PDF) vom Original am 2020-03-23. Abgerufen 2008-10-01. (xiv+294+4 Seiten)
- ^ "1. LD". UNIX -Programmierhandbuch (6 ed.). Mai 1975.
- ^ "Gnu Binutils: Linker -Skripte". 2018-07-18. Archiviert vom Original am 2020-03-06. Abgerufen 2019-01-18.
- ^ "LLD - Der LLVM -Linker - LLD 14 Dokumentation". lld.llvm.org.
- ^ "GCC 12 fügt Unterstützung für die Verwendung des Formlinkers hinzu". www.phoronix.com.
Weitere Lektüre
- Fraser, Christopher W.; Hanson, David R. (April 1982). "Ein maschinenunabhängiger Linker". Software: Übung und Erfahrung. John Wiley & Sons Ltd.. 12 (4): 351–366. doi:10.1002/spe.4380120407. ISSN 1097-024x. S2CID 206508204.
- Betriebssystem 360 - Linkage Editor (E) - Programmlogikhandbuch (PDF) (3 ed.). International Business Machines Corporation. 1969-07-23 [Juni 1967]. Programmnummer 360S-ED-510. Datei Nr. S360-31. Form Y28-6610-2. Archiviert von das Original (PDF) Am 2007-10-01. Abgerufen 2020-03-07.
- Jones, Douglas W. (August 1983). "Assemblersprache als Objektcode". Software: Übung und Erfahrung. John Wiley & Sons Ltd.. 13 (8): 715–725. doi:10.1002/spe.4380130806. ISSN 1097-024x. S2CID 42995338.
- Levine, John R. (2000) [Oktober 1999]. Linker und Lader. Die Morgan Kaufmann -Serie in Software Engineering and Programming (1 Ed.). San Francisco, USA: Morgan Kaufmann. ISBN 1-55860-496-0. OCLC 42413382. Archiviert vom Original am 2012-12-05. Abgerufen 2020-01-12. Code: [1][2] Errata: [3]
- Presser, Leon; White, John R. (September 1972). "Linker und Lader" (PDF). ACM Computing -Umfragen. Universität von Kalifornien, Santa Barbara, Kalifornien, USA. 4 (3): 149–167. doi:10.1145/356603.356605. S2CID 5694671. Archiviert (PDF) vom Original am 2020-03-07. Abgerufen 2020-03-07. (19 Seiten)
- Ramsey, Norman (Mai 1996). "Anweisungen für die Maschine durch Currying" verlagern " (PDF). ACM Sigplan nennt. 31 (5): 226–236. doi:10.1145/249069.231429. Archiviert (PDF) vom Original am 2020-05-18.
Externe Links
- Ian Lance Justin's Linker Blog-Einträge
- Linker und Lader, a Linux Journal Artikel von Sandeep Grover
- Eine weitere Auflistung, wo eine vollständige Sammlung kostenloser Tools für die Entwicklung der Montagesprachenentwicklung erhalten werden kann
- GNU -Linkerhandbuch
- LLD - der LLVM -Linker
- Linux Benutzerbefehle Handbuch : Der GNU -Linker -