ld ist der GNU-Linker aus den Binutils: Er setzt die vom Compiler erzeugten Objektdateien zu einem ausführbaren Programm oder einer Shared Library zusammen. Dabei löst er die undefined Symbole der einen Datei gegen die Definitionen anderer Dateien und Bibliotheken auf.

Die wichtigsten Optionen

ld -o programm datei1.o datei2.o        # Objektdateien linken
ld -o programm -L/usr/lib -lm datei.o   # Bibliothek im Pfad suchen
ld -shared -o libfoo.so datei.o         # Shared Library bauen
ld -static -o programm datei.o          # statisch linken
ld -r -o teil.o a.o b.o                 # relozierbaren Teil-Link
ld -T linker.ld -o programm datei.o     # mit Linker-Skript
ld -s -o programm datei.o               # Symboltabelle entfernen

Praxis-Beispiele

  • ld -o hallo hallo.o erzeugt das Programm; den Einstiegspunkt liefert standardmäßig das Symbol _start
  • -L/pfad -lname sucht nach libname.a-Archiven oder libname.so — Reihenfolge der Bibliotheken auf der Kommandozeile entscheidet über die Auflösung
  • Mit -T datei.ld steuert ein Linker-Skript, wohin Sektionen im Speicher landen — typisch für Embedded- und Kernel-Code
  • Im Alltag ruft man ld selten direkt auf: gcc-Befehle und andere Compiler-Frontends starten es selbst und reichen Optionen per -Wl,... durch

Einordnung

Die Symboltabelle ist die Sprache, in der Linker und Objektdateien kommunizieren — ld verknüpft die Teile, die nm-Befehle sichtbar machen. Das Ergebnis ist ein lauffähiges Programm, dessen Struktur sich mit readelf-Befehle und objdump-Befehle inspizieren lässt.

Verwandte Grundlagen: nm-Befehle (Symbole), addr2line-Befehle (Adressen).