Was ist eigentlich... ein Target Triplet?
by Viktor Garske on July 27, 2020, noonWer mit Linux in der Softwareentwicklung bereits öfter zu tun hatte, wird auf mysteriöse Bezeichnungen wie x86_64-linux-gnu-gcc
oder x86_64-unknown-linux-gnu
gestoßen sein. Hier fällt besonders der Term unknown auf. Wo kommt diese Zeichenkette her? Welche Funktion hat diese? Und was genau bedeutet es, wenn dort von unknown die Rede ist?
Eigentlich ist die Thematik relativ schnell abgehandelt, vor allen Dingen, weil sie auf den ersten Blick gar nicht erwähnenswert erscheint. Allerdings stört auf den zweiten Blick dieses unknown, welches klingt, als würde etwas nicht installiert sein, als würde das System nicht standardkonform arbeiten. Das ist jedoch nicht der Fall.
Bei dieser Zeichenkette handelt es sich um das Target Triplet, im LLVM-Umfeld auch als Target Triple bezeichnet. Es kommt aus der Welt der Cross-Compiler und wird zur eindeutigen Identifizierung von Plattformen benutzt.
Kurzer Exkurs in die Cross-Compiler: die grundsätzliche Aufgabe eines Compilers ist, Code einer Sprache einzulesen und Code in einer anderen Sprache auszugeben. In den meisten Fällen wird als Eingabe Quellcode einer höheren Programmiersprache und als Ausgabe Maschinencode in der Maschinensprache vorkommen. Da die Maschinensprache abhängig von Architektur, Plattform und weiteren Konventionen wie z. B. der ABI ist, muss ein Compiler genau wissen, welche Ausgabe generiert werden soll.
Diese Triplets sind beim GCC so aufgebaut:
arch-vendor-kernel-system
Dabei ist arch die Architektur, vendor stellt die Maschine dar und kernel sowie optional system beschreiben das Betriebssystem. System gibt insbesondere meist die ABI an. Diese ABI spezifiziert die Interaktion von Maschinencode untereinander und umfasst Aspekte wie die Calling Convention, also die Frage, wer den Stack nach einem Unterprogramm aufräumt. Hier wird oft zwischen GNU, Microsoft und Borland unterschieden.
Möchten wir uns solch ein Target Triplet für unser System anschauen, so reicht es, gcc -dumpmachine
aufzurufen. Es erscheint so etwas wie:
x86_64-pc-linux-gnu
Dieser x86_64
-PC arbeitet also mit Linux als Kernel und nutzt die GNU-ABI.
Manchmal steht aber unknown
im String:
x86_64-unknown-linux
Hier nutzt das System ebenfalls die x86_64
-Architektur und Linux als Kernel, es werden aber keine weiteren Informationen zum vendor angegeben. Bei GNU GCC ist die vendor-Angabe ohnehin meist irrelevant.
Wir sehen also, dass das vendor-Feld nichts mit einer Standardkonformität zu tun hat. Es ist lediglich eine historisch gewachsene Angabe zum Anbieter einer Plattform und kann Werte wie pc
, apple
, ibm
– oder eben, wenn nichts weiter spezifiziert ist, unknown
für die Standardwerte annehmen. Vorteil der konsequenten Angabe des vendor-Feldes ist das vereinfachte Parsing, oftmals wird allerdings das Feld von einigen Programmen schon ausgelassen.
Das Compilerframework LLVM nennt die Zeichenkette Target Triplet und hat eine ähnliche Vorgabe:
<arch><sub>-<vendor>-<sys>-<abi>
Hier kommt zusätzliche Informationen wie sub hinzu, um beispielhaft auf die verschiedenen Versionen der ARM-Plattform wie armv5 oder armv7a zu reagieren, ansonsten sind die Angaben nahezu identisch.
Zusammenfassend wird diese Angabe für die eindeutige Bezeichnung verschiedener Plattformen genutzt. Während die Architektur immer klar gennant wird, hängen die zusätzlichen Felder für Kernel, Anbieter oder ABI vom Compiler und der verwendeten Software ab. Die generische Angabe unknown
im vendor-Feld ist im Grunde ein default-Wert und bedeutet lediglich, dass die Plattform nicht speziell mit einem bestimmten Anbieter zusammenhängt und dass die Standardwerte vom Compiler verwendet werden oder wurden.
Weitere Informationen können im OSDev Wiki sowie den Dokumentationen von GNU Autoconf oder GDC gefunden werden.
Viktor Garske
Viktor Garske ist der Hauptautor des Blogs und schreibt gerne über Technologie, Panorama sowie Tipps & Tricks.