Programmieren: Wie man Linker in der Softwareentwicklung richtig nutzt
Linker sind ein wichtiges Programmierwerkzeug, fügen einzelne Programmmodule zu einer ausführbaren Binärdatei zusammen und können Speicherplatz und Zeit sparen.
- Dr. Christoph Erhardt
Wäre die Werkzeugkette der Softwareentwicklung eine Rockband, dann wäre der Compiler ihr Frontmann: berühmt, berüchtigt und in aller Munde. Dem Linker fiele eher die Rolle des Bassisten zu: unauffällig bis unsichtbar und nur einschlägig Interessierten namentlich bekannt. Das geht so weit, dass manche sich fragen, ob der Linker mehr als ein arkanes Relikt aus grauer Vorzeit ist und ob außerhalb des althergebrachten C-/C++-Ökosystems überhaupt ein Linker zum Einsatz kommt. Die Antwort ist ein klares Ja. Egal, ob man Code in C++, Go, Rust oder Haskell schreibt: Wann immer am Ende des Bauvorgangs eine nativ ausführbare Binärdatei herauspurzelt, wurde sie durch einen Linker erzeugt.
Dieser Artikel beleuchtet die technischen Grundlagen des Linkens und beschreibt, was unter der Haube passiert. Der technische Fokus liegt auf der Verarbeitung von ELF-Programmen (Executable and Linking Format) unter Linux; die Konzepte sind aber genauso auf andere gängige Binärformate wie PE (Windows) oder Mach-O (macOS, iOS) anwendbar. Ein künftiger Artikel wird sich dann mit der Praxis befassen und zeigen, welche Features ein moderner Linker beherrscht und welche Linker es im Open-Source-Umfeld gibt. Wer auf den richtigen Linker setzt, kann damit zeitkritische Teile des Bauprozesses um ein Vielfaches beschleunigen.
- Linker verbinden Programmmodule zu einem ausfĂĽhrbaren Programm oder zu einer Bibliothek.
- Vor allem dynamische Bibliotheken stellen Linker vor anspruchsvolle Aufgaben.
- Die verwendeten Beispiele demonstrieren die Verarbeitung von ELF-Programmen (Executable and Linking Format) unter Linux, die grundlegenden Konzepte gelten aber genauso für andere Binärformate auf anderen Plattformen.
Linker im Detail: ein Blick unter die Haube
Für alle gängigen Programmiersprachen ist der Compiler nach wie vor so ausgelegt, dass er jedes Quellmodul separat verarbeitet. So erzeugt ein C-Compiler für jede .c-Quelldatei eine zugehörige .o-Objektdatei, die den Maschinencode für dieses Modul enthält. Dem Linker fällt nun die Aufgabe zu, diese Ansammlung von Einzelmodulen zu einer ausführbaren Binärdatei oder ladbaren Bibliothek zusammenzufügen. Die klare Arbeitsteilung trägt zur Wiederverwendbarkeit bei; so kann ein und derselbe Linker mit den verschiedensten Compilern zusammenarbeiten.
Das war die Leseprobe unseres heise-Plus-Artikels "Programmieren: Wie man Linker in der Softwareentwicklung richtig nutzt". Mit einem heise-Plus-Abo können sie den ganzen Artikel lesen und anhören.