Cross-Compiler — Änderungen 4452 → 5014

Zeile 1: Zeile 1:
 
Ein Cross-Compiler ist ein Compiler, der Objektdateien für eine andere Plattform (Zielplattform oder target) als die Verwendete (host) erzeugt. Die Zielplattform kann sich dabei sowohl beim Betriebssystem, als auch beim verwendeten Prozessor unterscheiden.  
 
Ein Cross-Compiler ist ein Compiler, der Objektdateien für eine andere Plattform (Zielplattform oder target) als die Verwendete (host) erzeugt. Die Zielplattform kann sich dabei sowohl beim Betriebssystem, als auch beim verwendeten Prozessor unterscheiden.  
  
−
= Anforderungen =
+
== Anforderungen ==
 
Um einen Cross-Compiler zu bauen, werden die üblichen GNU-Tools benötigt. Dazu gehören binutils, gcc und make.  
 
Um einen Cross-Compiler zu bauen, werden die üblichen GNU-Tools benötigt. Dazu gehören binutils, gcc und make.  
  
−
== Linux ==
+
=== Linux ===
 
Auf vielen Linux-Distributionen sind diese Programme standardmässig dabei. Wer eine Binärdistribution, wie zum Beispiel Ubuntu oder andere debian-Derivate, einsetzt und noch keine Programme kompiliert hat, muss unter Umständen noch Entwicklungspakete installieren (bei Ubuntu/Debian libc6-dev und texinfo).
 
Auf vielen Linux-Distributionen sind diese Programme standardmässig dabei. Wer eine Binärdistribution, wie zum Beispiel Ubuntu oder andere debian-Derivate, einsetzt und noch keine Programme kompiliert hat, muss unter Umständen noch Entwicklungspakete installieren (bei Ubuntu/Debian libc6-dev und texinfo).
  
−
== Windows ==
+
=== Windows ===
 
Wer Windows einsetzt hat grundsätzlich zwei Möglichkeiten an diese Tools zu kommen. Entweder [http://www.cygwin.com/ cygwin] ([http://www.cygwin.com/setup.exe Direktlink zum Installer]) oder [http://www.mingw.org/ mingw]
 
Wer Windows einsetzt hat grundsätzlich zwei Möglichkeiten an diese Tools zu kommen. Entweder [http://www.cygwin.com/ cygwin] ([http://www.cygwin.com/setup.exe Direktlink zum Installer]) oder [http://www.mingw.org/ mingw]
  
−
=== Cygwin ===
+
==== Cygwin ====
 
Die Installation von Cygwin gestaltet sich recht einfach. Bei der Installation müssen jedoch ein paar Dinge beachtet werden, das betrifft vor allem die Auswahl der richtigen Pakete. Für das Kompilieren eines Cross-gcc müssen die folgenden Pakete unbedingt installiert werden:
 
Die Installation von Cygwin gestaltet sich recht einfach. Bei der Installation müssen jedoch ein paar Dinge beachtet werden, das betrifft vor allem die Auswahl der richtigen Pakete. Für das Kompilieren eines Cross-gcc müssen die folgenden Pakete unbedingt installiert werden:
 
* Devel -> gcc4
 
* Devel -> gcc4
Zeile 21: Zeile 21:
 
Nach der Installtion müssen die Shellbefehle (siehe unten) in die cygwin Shell eingegeben werden.
 
Nach der Installtion müssen die Shellbefehle (siehe unten) in die cygwin Shell eingegeben werden.
  
−
=== mingw ===
+
==== mingw ====
 
TODO
 
TODO
  
  
−
= binutils =
+
== binutils ==
 
Die GNU-binutils beinhalten unter anderem den Linker ld, den Assembler as und viele weitere kleine Helfer wie ar, objdump oder objcopy. Da gcc auf diesen basiert, müssen diese vor dem gcc kompiliert werden. Diese sind streng genommen auch Bestandteil des Cross-Compilers, da sie auch für eine bestimmte Target- und Host-Plattform konfiguriert werden müssen.
 
Die GNU-binutils beinhalten unter anderem den Linker ld, den Assembler as und viele weitere kleine Helfer wie ar, objdump oder objcopy. Da gcc auf diesen basiert, müssen diese vor dem gcc kompiliert werden. Diese sind streng genommen auch Bestandteil des Cross-Compilers, da sie auch für eine bestimmte Target- und Host-Plattform konfiguriert werden müssen.
 
Jetzt aber zur eigentlichen Arbeit. Um die binutils zu kompilieren, muss zuerst der Quellcode heruntergeladen werden. Dieser kann von http://ftp.gnu.org/gnu/binutils/ bezogen werden. In diesem Artikel wird von der Version 2.19.1 ausgegangen:
 
Jetzt aber zur eigentlichen Arbeit. Um die binutils zu kompilieren, muss zuerst der Quellcode heruntergeladen werden. Dieser kann von http://ftp.gnu.org/gnu/binutils/ bezogen werden. In diesem Artikel wird von der Version 2.19.1 ausgegangen:
Zeile 32: Zeile 32:
 
  $ tar -xjf binutils-2.19.1.tar.bz2
 
  $ tar -xjf binutils-2.19.1.tar.bz2
  
−
== Konfigurieren ==
+
=== Konfigurieren ===
 
Der nächste Schritt ist das Konfigurieren. Die Dokumentation empfiehlt binutils ausserhalb des Quellverzeichnisses zu konfigurieren und zu kompilieren:
 
Der nächste Schritt ist das Konfigurieren. Die Dokumentation empfiehlt binutils ausserhalb des Quellverzeichnisses zu konfigurieren und zu kompilieren:
 
  $ mkdir binutils-build
 
  $ mkdir binutils-build
Zeile 40: Zeile 40:
 
Als Zielplattform wird hier i386-elf benutzt, da dies wohl die Meistbenutzte im Zusammenhang mit Betriebssystementwicklung ist. Der letzte Schalter <tt>--disable-nls</tt> dient dazu, sämtliche Übersetzungen zu deaktivieren, da die meist mehr verwirren als nützen.
 
Als Zielplattform wird hier i386-elf benutzt, da dies wohl die Meistbenutzte im Zusammenhang mit Betriebssystementwicklung ist. Der letzte Schalter <tt>--disable-nls</tt> dient dazu, sämtliche Übersetzungen zu deaktivieren, da die meist mehr verwirren als nützen.
  
−
== Kompilieren ==
+
=== Kompilieren ===
 
Nach dem Konfigurieren ist der nächste Schritt das Kompilieren:
 
Nach dem Konfigurieren ist der nächste Schritt das Kompilieren:
 
  $ make all
 
  $ make all
 
Wer eine CPU mit mehreren Kernen benutzt, kann diesen Vorgang etwas beschleunigen, wenn er den Parameter -j3 benutzt. Dieser signalisiert make, dass maximal 3 Instanzen des Compilers zur selben Zeit laufen dürfen. Standardmässig wird hier 1 benutzt. Als Daumenregel wird oft Anzahl der Kerne + 1 empfohlen.
 
Wer eine CPU mit mehreren Kernen benutzt, kann diesen Vorgang etwas beschleunigen, wenn er den Parameter -j3 benutzt. Dieser signalisiert make, dass maximal 3 Instanzen des Compilers zur selben Zeit laufen dürfen. Standardmässig wird hier 1 benutzt. Als Daumenregel wird oft Anzahl der Kerne + 1 empfohlen.
  
−
== Installieren ==
+
=== Installieren ===
 
Sobald das Kompilieren abgeschlossen ist, können die binutils installiert werden:
 
Sobald das Kompilieren abgeschlossen ist, können die binutils installiert werden:
 
  $ make install
 
  $ make install
 
  $ cd ..
 
  $ cd ..
  
−
= gcc =
+
== gcc ==
 
Nachdem nun die binutils kompiliert und installiert wurden, kann mit gcc weitergefahren werden. Für das Konfigurieren von gcc müssen die Binutils in $PATH also der Umgebungsvariable, die die Verzeichnisse enthält, in denen nach ausführbaren Dateien gesucht werden soll, enthält, sein. Erreicht wird das durch:
 
Nachdem nun die binutils kompiliert und installiert wurden, kann mit gcc weitergefahren werden. Für das Konfigurieren von gcc müssen die Binutils in $PATH also der Umgebungsvariable, die die Verzeichnisse enthält, in denen nach ausführbaren Dateien gesucht werden soll, enthält, sein. Erreicht wird das durch:
 
  $ export PATH="/usr/local/crosstools/bin:$PATH"
 
  $ export PATH="/usr/local/crosstools/bin:$PATH"
Zeile 61: Zeile 61:
 
  $ tar -xjf gcc-g++-4.4.0.tar.bz2
 
  $ tar -xjf gcc-g++-4.4.0.tar.bz2
  
−
== Konfigurieren ==
+
=== Konfigurieren ===
 
Auch für gcc wird empfohlen, ihn ausserhalb des Quellverzeichnisses zu bauen:
 
Auch für gcc wird empfohlen, ihn ausserhalb des Quellverzeichnisses zu bauen:
 
  $ mkdir gcc-build
 
  $ mkdir gcc-build
Zeile 68: Zeile 68:
 
Beim Konfigurieren von gcc muss unbedingt darauf geachtet werden, dass der selbe Präfix wie bei binutils benutzt wird. Sonst benutzt gcc später den falschen Assembler. Die drei ersten Konfigurationsoptionen haben wieder die selbe Bedeutung wie bei gcc und werden hier deshalb nicht noch mal erläutert. Der Schalter --without-headers teilt gcc mit, dass keine Libc Header installiert sind und er sie somit nicht benutzen darf, und die letzte Option --enable-languages legt die Sprachen fest, die der Compiler beherrschen soll. Wie vorhin schon gesagt, muss für den C++ Compiler das 2. Archiv auch heruntergeladen werden. Wenn der Compiler nur C kompilieren soll muss auch nur --enable-languages=c angegeben werden.
 
Beim Konfigurieren von gcc muss unbedingt darauf geachtet werden, dass der selbe Präfix wie bei binutils benutzt wird. Sonst benutzt gcc später den falschen Assembler. Die drei ersten Konfigurationsoptionen haben wieder die selbe Bedeutung wie bei gcc und werden hier deshalb nicht noch mal erläutert. Der Schalter --without-headers teilt gcc mit, dass keine Libc Header installiert sind und er sie somit nicht benutzen darf, und die letzte Option --enable-languages legt die Sprachen fest, die der Compiler beherrschen soll. Wie vorhin schon gesagt, muss für den C++ Compiler das 2. Archiv auch heruntergeladen werden. Wenn der Compiler nur C kompilieren soll muss auch nur --enable-languages=c angegeben werden.
  
−
== Kompilieren ==
+
=== Kompilieren ===
 
Auch hier ist der nächste Schritt nach dem Konfigurieren wieder das Kompilieren. Dieser Prozess dauert je nach Prozessorleistung recht lange. Hier kann auch wie bei binutils die Option -j3 benutzt werden. Gestartet wird das Kompilieren folgendermassen:
 
Auch hier ist der nächste Schritt nach dem Konfigurieren wieder das Kompilieren. Dieser Prozess dauert je nach Prozessorleistung recht lange. Hier kann auch wie bei binutils die Option -j3 benutzt werden. Gestartet wird das Kompilieren folgendermassen:
 
  $ make all-gcc all-target-libgcc
 
  $ make all-gcc all-target-libgcc
  
−
== Installieren ==
+
=== Installieren ===
 
Nachdem gcc fertig kompiliert ist, kann er installiert werden. Das geschieht mit diesem Befehl:
 
Nachdem gcc fertig kompiliert ist, kann er installiert werden. Das geschieht mit diesem Befehl:
 
  $ make install-gcc install-target-libgcc
 
  $ make install-gcc install-target-libgcc
  
−
= Benutzung =
+
== Benutzung ==
 
Beim Kompilieren von Programmen mit dem neuen Crosscompiler muss daran gedacht werden, dass dieser nur zum Kompilieren und nicht zum Linken benutzt werden kann, denn dafür fehlt eine installierte Libc. Deshalb muss der gcc mit dem -c Flag aufgerufen wird, damit er nur den Präprozessor aufruft und den Quellcode kompiliert aber nicht linkt.
 
Beim Kompilieren von Programmen mit dem neuen Crosscompiler muss daran gedacht werden, dass dieser nur zum Kompilieren und nicht zum Linken benutzt werden kann, denn dafür fehlt eine installierte Libc. Deshalb muss der gcc mit dem -c Flag aufgerufen wird, damit er nur den Präprozessor aufruft und den Quellcode kompiliert aber nicht linkt.
 
Außerdem muss beachtet werden, dass der cross-kompilierte gcc nicht über das Kommando 'gcc' sondern über '/user/local/crosstools/bin/i386-elf-gcc' erreichbar ist. Dies gilt auch für g++ und alle Tools aus den binutils.
 
Außerdem muss beachtet werden, dass der cross-kompilierte gcc nicht über das Kommando 'gcc' sondern über '/user/local/crosstools/bin/i386-elf-gcc' erreichbar ist. Dies gilt auch für g++ und alle Tools aus den binutils.
 +
 +
[[Kategorie:Compiler]]