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.

Artikel verschenken
In Pocket speichern vorlesen Druckansicht
Lesezeit: 17 Min.
Von
  • Dr. Christoph Erhardt
Inhaltsverzeichnis

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.

Mehr zu Softwareentwicklung:
Dr. Christoph Erhardt

Dr. Christoph Erhardt entwickelt als Senior Software Engineer bei Method Park by UL Softwareplattformen für Medizingeräte. Er steuert Patches zum mold-Linker bei und betreut das mold-Paket als Maintainer für Fedora Linux.

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.

iX-tract
  • 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.

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.