Cross-Compiler — Änderungen 10964 → 11334

Zeile 13: Zeile 13:
 
In diesen Fällen muss man einen Cross-Compiler erstellen bzw. verwenden.
 
In diesen Fällen muss man einen Cross-Compiler erstellen bzw. verwenden.
  
−
 
+
== Target Triplets ==
 +
Target Triplets beschreiben eine Maschine. Man kann sie mithilfe von <pre>gcc -dumpmachine</pre> für die derzeitige Maschine anzeigen lassen.
 +
Ein Target Triplet besteht aus vier teilen, bei denen die mittleren beiden weggelassen werden können.
 +
  architektur-hersteller-betriebsystem-abi (/Binärformat)
 +
Ein beispiel von einem Raspberry Pi 2:
 +
  armv7l-unknown-linux-gnueabihf
 +
Das sagt aus, dass die Maschine einen [[Little-Endian]] ARMv7 Prozessor hat, unter Linux läuft und die GNU-embedded-ABI mit Hardfloat verwendet.
 +
Hersteller "unknown" kann weggelassen werden, das Betriebsystem kann auch weggelassen werden und wird als "none" angenommen.
 +
Weitere Beispiele:
 +
  arm-none-eabi (ARM ohne spezielles Betriebsystem und ein embedded ABI)
 +
  i686-elf (i686 ohne spezielles Betriebsystem und ELF als Binärformat)
 +
  armeb-eabi ([[Big-Endian]] ARM mit embedded ABI)
 +
  x86_64-elf (x86_64 mit ELF als Binärformat)
 
== Bau eines Cross-Compilers ==
 
== Bau eines Cross-Compilers ==
−
Der Bau eines Cross-Compilers gestaltet sich recht einfach. Meistens gilt es, sich die aktuellen binutils und den gcc herunterzuladen. Die Befehle zum Übersetzen gleichen sich unter Linux und Windows (Cygwin, MinGW).
+
Der Bau eines Cross-Compilers gestaltet sich recht einfach. Meistens gilt es, sich die aktuellen binutils und den gcc herunterzuladen. Die Befehle zum Übersetzen gleichen sich unter Linux und Windows (Cygwin, MinGW). Man sollte beachten, dass man eine recht aktuelle Version von GCC auf dem System installiert haben sollte (z.B. GCC >= 4.9). Man benötigt außerdem g++, welches in den meisten Distributionen zusammen mit GCC installiert wird
  
 
=== Linux ===
 
=== Linux ===
−
Unter Linux kann es passieren, dass spätestens beim Konfigurieren vom gcc selbiges mit der Fehlermeldung abbricht, dass zwei Libraries nicht installiert seien: GMP und MPFR. Diese sind dann aus der Paketverwaltung der Distribution zu beziehen oder können [ftp://ftp.gmplib.org/pub/gmp-4.3.1/gmp-4.3.1.tar.bz2 hier] und [http://www.mpfr.org/mpfr-current/mpfr-2.4.1.tar.bz2 hier] heruntergeladen werden. Diese müssen nur entpackt und mit dem in Linux bekannten Dreisatz ''./configure, make, make install'' gebaut und installiert werden.
+
Unter Linux kann es passieren, dass spätestens beim Konfigurieren vom gcc selbiges mit der Fehlermeldung abbricht, dass drei Libraries nicht installiert seien: GMP, MPFR und MPC. Diese sind dann aus der Paketverwaltung der Distribution zu beziehen oder können [ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz hier], [ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.3.tar.xz hier] und [ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.3.tar.xz hier] heruntergeladen werden. Diese können entpackt und mit dem in Linux bekannten Dreisatz ''./configure, make, make install'' gebaut und installiert werden. Die nachfolgende Anleitung benötigt aber die installation dieser 3 Libraries.
  
  
Zeile 27: Zeile 39:
 
Cygwin kann als „emulierte Linux-Umgebung“ unter MS Windows angesehen werden. Cygwin lässt sich leicht installieren: [http://www.cygwin.com/setup.exe diese] Setup-Datei reicht, den Rest erledigt der Installer. Es können dann alle benötigten Pakete heruntergeladen und ebenfalls installiert werden. Besonders wichtig sind folgende Pakete:  
 
Cygwin kann als „emulierte Linux-Umgebung“ unter MS Windows angesehen werden. Cygwin lässt sich leicht installieren: [http://www.cygwin.com/setup.exe diese] Setup-Datei reicht, den Rest erledigt der Installer. Es können dann alle benötigten Pakete heruntergeladen und ebenfalls installiert werden. Besonders wichtig sind folgende Pakete:  
  
−
* Devel → gcc4
+
* Devel → gcc5
 
* Devel → make
 
* Devel → make
−
* Libs → libgmp-devel
 
−
* Libs → libmpfr-devel
 
 
* Web → wget
 
* Web → wget
  
 
optional:
 
optional:
 
* Devel → [[Netwide Assembler | nasm]]
 
* Devel → [[Netwide Assembler | nasm]]
 +
* Libs → libgmp-devel
 +
* Libs → libmpfr-devel
 +
* Libs → libmpc-devel
  
 
Ist Cygwin erfolgreich eingerichtet, können die binutils sowie der gcc entsprechend der Vorgehensweise unter Ablauf gebaut werden.
 
Ist Cygwin erfolgreich eingerichtet, können die binutils sowie der gcc entsprechend der Vorgehensweise unter Ablauf gebaut werden.
  
 
==== MinGW ====
 
==== MinGW ====
−
MinGW ist ein auf MS Windows portierter GCC. Die neueste Version des Installers für MinGW kann man auf der Projektseite unter [http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/ Installer / mingw-get-inst] herunterladen. Bei der Installation sollte man das MSYS Base System noch auswählen. Um GCC zu kompilieren, muss man außerdem GMP, MPFR und MPC nachinstallieren, indem man nach der Installation mingw-get in der MinGW Shell aufruft:
+
MinGW ist ein auf MS Windows portierter GCC. Die neueste Version des Installers für MinGW kann man auf der Projektseite unter [http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/ Installer / mingw-get-inst] herunterladen. Bei der Installation sollte man das MSYS Base System noch auswählen. Um GCC zu kompilieren, kann man außerdem GMP, MPFR und MPC nachinstallieren, indem man nach der Installation mingw-get in der MinGW Shell aufruft:
  
 
  mingw-get install gmp mpfr mpc
 
  mingw-get install gmp mpfr mpc
Zeile 47: Zeile 60:
 
=== Ablauf ===
 
=== Ablauf ===
 
Der Ablauf ist immer der gleiche. Folgende Pakete müssen heruntergeladen werden:
 
Der Ablauf ist immer der gleiche. Folgende Pakete müssen heruntergeladen werden:
−
[http://ftp.gnu.org/gnu/binutils/binutils-2.20.tar.bz2 Binutils] und
+
[http://ftp.gnu.org/gnu/binutils/binutils-2.26.tar.bz2 Binutils],
−
[http://ftp.gnu.org/gnu/gcc/gcc-4.4.2/gcc-core-4.4.2.tar.bz2 gcc] und anschließend mittels
+
[http://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.bz2 gcc], den oben genannten Links für MPC, MPFR und GMP und anschließend mittels
−
  $ tar -xjf binutils-2.20.tar.bz2
+
  $ tar -xf binutils-2.26.tar.bz2
−
  $ tar -xjf gcc-core-4.4.2.tar.bz2
+
  $ tar -xf gcc-5.3.0.tar.bz2
 +
$ cd gcc-5.3.0
 +
$ tar -xf ../mpc-1.0.3.tar.gz
 +
$ mv mpc-1.0.3 mpc
 +
$ tar -xf ../mpfr-3.1.3.tar.xz
 +
$ mv mpfr-3.1.3 mpfr
 +
$ tar -xf ../gmp-6.1.0.tar.xz
 +
$ mv gmp-6.1.0 gmp
 +
$ cd ..
  
−
entpackt werden. Wenn noch weitere Sprachen zusätzlich zu C unterstützt werden sollen, müssen weitere Pakete heruntergeladen werden. Für C++ benötigt man zum Beispiel [http://ftp.gnu.org/gnu/gcc/gcc-4.4.2/gcc-g++-4.4.2.tar.bz2 dieses] Paket. Die komplette Liste befindet sich im Verzeichnis der jeweiligen GCC-Version auf dem FTP-Server. Danach müssen sie mit speziellen Parametern konfiguriert werden. Der Einfachheit halber sollte man dabei folgende Variablen setzen:
+
entpackt werden.  
  
 
  $ export TARGET=ziel-plattform
 
  $ export TARGET=ziel-plattform
 
  $ export PREFIX=wo-die-crossutils-landen-sollen
 
  $ export PREFIX=wo-die-crossutils-landen-sollen
 +
$ export PATH=$PREFIX/bin:$PATH
  
 
Dann reicht es, beim configure --target=$TARGET und --prefix=$PREFIX anzugeben. Auch ist es sinnvoll, die binutils und den gcc außerhalb ihrer entpackten Verzeichnisse zu bauen, also immer separate Verzeichnisse zu erstellen (gcc-ARCHITEKTUR und binutils-ARCHITEKTUR eignen sich beispielsweise hierfür). Jetzt konfigurieren wir die Pakete mit folgenden Befehlen (jeweils im entsprechenden separaten Verzeichnis (gcc-ARCHITEKTUR und binutils-ARCHITEKTUR) ausführen):
 
Dann reicht es, beim configure --target=$TARGET und --prefix=$PREFIX anzugeben. Auch ist es sinnvoll, die binutils und den gcc außerhalb ihrer entpackten Verzeichnisse zu bauen, also immer separate Verzeichnisse zu erstellen (gcc-ARCHITEKTUR und binutils-ARCHITEKTUR eignen sich beispielsweise hierfür). Jetzt konfigurieren wir die Pakete mit folgenden Befehlen (jeweils im entsprechenden separaten Verzeichnis (gcc-ARCHITEKTUR und binutils-ARCHITEKTUR) ausführen):
  
 
binutils:
 
binutils:
−
  $ Pfad/zum/Code/configure  --prefix=$PREFIX --with-sysroot=$PREFIX --target=$TARGET --disable-nls
+
  $ Pfad/zum/Code/configure  --prefix=$PREFIX --with-sysroot=$PREFIX --target=$TARGET --disable-nls --disable-werror
  
 
gcc:
 
gcc:
−
  $ Pfad/zum/Code/configure --prefix=$PREFIX --target=$TARGET --disable-nls --enable-languages=c --disable-shared --disable-libssp --without-headers
+
  $ Pfad/zum/Code/configure --prefix=$PREFIX --target=$TARGET --disable-nls --enable-languages=c,c++ --disable-shared --without-headers
−
 
 
−
für welche CPU-Architektur der Cross-Compiler gebaut wird, wird mit dem <i>target</i>-Parameter angegeben. Hier eine nicht vollständige Liste der wichtigsten Targets:
 
−
* ''x86_64-elf'' (um auf einem 32-Bit-Prozessor/-OS für ein(en) 64-Bit-Prozessor/-OS zu kompilieren. Kann auch verwendet werden, um sich einen Cross-Compiler für Windows zu bauen.)
 
−
* ''arm-unknown-linux-gnu'' (um für ARM-Systeme Code zu kompilieren.)
 
  
−
Wenn weitere Sprachen unterstützt werden sollen und die entsprechenden Pakete heruntergeladen und entpackt wurden, dann müssen die Sprachen bei <i>--enable-languages=</i> durch Kommata getrennt aufgezählt werden.
 
 
Nachdem die Pakete nun konfiguriert wurden, müssen die '''binutils''' mit
 
Nachdem die Pakete nun konfiguriert wurden, müssen die '''binutils''' mit
  
Zeile 77: Zeile 94:
 
bzw. der '''gcc''' mit
 
bzw. der '''gcc''' mit
 
  $ make all-gcc
 
  $ make all-gcc
 +
$ make target-libgcc
 
  $ make install-gcc
 
  $ make install-gcc
 +
$ make install-target-libgcc
  
 
gebaut und installiert werden.
 
gebaut und installiert werden.
  
 
== Siehe auch ==
 
== Siehe auch ==
−
* [[X86-64_Cross-Compiler|Cross-Compiler für x86-64-Systeme]]
 
−
* [[ARM_Cross-Compiler|Cross-Compiler für ARM-Systeme]]
 
 
* [[Crosscompiler_für_Windows|Cross-Compiler für Windows (erzeugt ELF-Dateien)]]
 
* [[Crosscompiler_für_Windows|Cross-Compiler für Windows (erzeugt ELF-Dateien)]]