Forum: PC-Programmierung Crosscompiler - Erklärungen


von Hans (Gast)


Lesenswert?

Hi,

ich arbeite mich gerade in die Linux-Welt ein und wollte gern einen 
Cross-Compiler installieren für mein ARM-Prozessorboard.

Weiß jmd wo ich im Netz entsprechende Informationen über die einzelnen 
"Teilbefehle" wie z.B. "-enable-interwork" oder -enable-target-optspace" 
bekomme? Oder gibt es diese nur mit configure --help?
1
cd build-binutils
2
3
../binutils-2.19/configure --target=arm-elf --prefix=/gnutools \
4
--enable-interwork --enable-multilib --enable-target-optspace \
5
--with-float=soft --disable-werror

Vielen Dank
Hans

von Strickwettbewerbgewinner (Gast)


Lesenswert?

Verwende vielleicht lieber einen bereits fertig compilierten Compiler um 
dir diesen ganzen Ärger zu sparen:
https://launchpad.net/gcc-arm-embedded
da gibts auch Linux-Binaries zum Download, muss man nur entpacken.

von Hans (Gast)


Lesenswert?

hmm im Endeffekt möchte ich gern eCos für meinen Crosscompiler 
installieren und verwenden.

Ich hab jetzt die folgenden Elemente installiert:
1
tar -xvf gcc-4.7.1.tar.bz2
2
tar -xvf binutils-2.13.1.tar.bz2
3
tar -xvf gdb-7.4.tar.bz2
4
tar -xvf insight-6.8-1a.tar.bz2
5
tar -xvf gmp-5.0.2.tar.gz
6
tar -xvf mpc-1.0.tar.gz
7
tar -xvf mpfr-3.1.1.tar.gz
8
9
cd build-binutils
10
../binutils-2.19/configure --target=arm-eabi --prefix=/gnutools --enable-interwork \
11
--enable-multilib --enable-target-optspace --with-float=soft --disable-werror
12
13
14
cd build_mpc-1.0
15
../mpc-1.0/configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc --with-mpfr=/tmp/gcc
16
17
make && make check && make install
18
19
20
cd build_mpfr-3.1.1
21
.
22
./mpfr-3.1.1/configure --disable-shared --enable-static --prefix=/tmp/gcc --with-gmp=/tmp/gcc
23
24
make && make check && make install
25
26
27
cd build_gmp-4.3.2
28
../gmp-4.3.2/configure --disable-shared --enable-static --prefix=/tmp/gcc
29
30
make && make check && make install
31
32
33
cd build-gcc
34
35
../gcc-4.7.1/configure --target=arm-eabi --prefix=/gnutools --enable-interwork --enable-multilib --enable-languages="c,c++" --enable-target-optspace --with-float=soft --with-newlib --with-headers=../newlib-1.16.0/newlib/libc/include/ --disable-nls 
36
37
sudo make all-gcc install-gcc 
38
PATH=/gnutools/bin:$PATH
39
40
cd build-insight
41
42
../insight-6.8/configure --target=arm-eabi --prefix=/gnutoolss --enable-interwork --enable-multilib --enable-target-optspace --disable-werror
43
44
make all
45
sudo make install

Hat auch soweit alles ohne Fehlermeldungen geklappt. Danach hab ich eCos 
3.0 installiert und die ECOS_REPOSITORY entsprechend angelegt. Gefunden 
wird auch alles.

Wenn ich jetzt allerdings die Software kombiliere möchte, bekomme ich 
die Fehlermeldung, dass -mcpu=arm9 nicht aufgeschlüsselt werden kann.

Muss ich arm9 beim Crosscompiler irgendwo angeben?

von hal9000 (Gast)


Lesenswert?

wusel * wusel = wuselquadrat

von schroeder (Gast)


Lesenswert?

probier mal ng crosstool aus damit bau ich immer meine toolchaines.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hans schrieb:
> Ich hab jetzt die folgenden Elemente installiert:
>
> tar -xvf gcc-4.7.1.tar.bz2
> tar -xvf binutils-2.13.1.tar.bz2

Warum eine sooo alte Version?

> tar -xvf gdb-7.4.tar.bz2
> tar -xvf insight-6.8-1a.tar.bz2

> tar -xvf gmp-5.0.2.tar.gz
> tar -xvf mpc-1.0.tar.gz
> tar -xvf mpfr-3.1.1.tar.gz

Warum nicht wie in der GCC-Doku für GMP/MPFR/MPC empfohlen?

> cd build-binutils
> ../binutils-2.19/configure --target=arm-eabi --prefix=/gnutools
> --enable-interwork \
> --enable-multilib --enable-target-optspace --with-float=soft
> --disable-werror

Warum verwendest du GCC configure-Schalter wie --enable-target-optspace
für die binutils???

> cd build_mpc-1.0

Und warum werden binutils nicht installiert?

> ../mpc-1.0/configure --disable-shared --enable-static --prefix=/tmp/gcc
> --with-gmp=/tmp/gcc --with-mpfr=/tmp/gcc
>
> make && make check && make install
>
> cd build_mpfr-3.1.1
> ../mpfr-3.1.1/configure --disable-shared --enable-static
> --prefix=/tmp/gcc --with-gmp=/tmp/gcc
>
> make && make check && make install
>
>
> cd build_gmp-4.3.2
> ../gmp-4.3.2/configure --disable-shared --enable-static
> --prefix=/tmp/gcc
>
> make && make check && make install
>
>
> cd build-gcc
>
> ../gcc-4.7.1/configure --target=arm-eabi --prefix=/gnutools
> --enable-interwork --enable-multilib --enable-languages="c,c++"
> --enable-target-optspace --with-float=soft --with-newlib
> --with-headers=../newlib-1.16.0/newlib/libc/include/ --disable-nls
>
> sudo make all-gcc install-gcc
> PATH=/gnutools/bin:$PATH

Warum erzeugst du keine libgcc?
Keine libstdc++?
Keine newlib?
Wenn du schon GMP/MPFR/MPC händisch erzeugst, wie soll GCC sie finden?
Passen die newlib-Header auf das Target?
Oder sind das Header für dein Build-System?
Warum installiert du keine libgcc?
Keine libstdc++?
Keine newlib?

Warum make als root???

> Wenn ich jetzt allerdings die Software kombiliere möchte, bekomme ich
                                         ^^^^^^^^^^ compilieren
> die Fehlermeldung, dass -mcpu=arm9 nicht aufgeschlüsselt werden kann.

Die Fehlermeldung ist "-mcpu=arm9 kann nicht aufgeschlüsselt werden"???

Vom Compiloer?
Vom Assembler?
Vom Linker?
Von eCos?

Fragen über Fragen...

von Hans (Gast)


Lesenswert?

Johann L. schrieb:
> Die Fehlermeldung ist "-mcpu=arm9 kann nicht aufgeschlüsselt werden"???

Ich hab bereits ein fertiges config.mk File welches allerdings noch mit 
make compiliert werden muss. Dabei entsteht die Fehlermeldung, dass 
mcpu=arm9 nicht vorhanden ist.

Den gleichen bzw. ähnlichen Fehler bekomme ich auch, wenn ich folgende 
Befehle eingebe:
1
$ ecosconfig new pid
2
$ ecosconfig tree
3
make 
4
/*
5
<-- error: mcpu=arm7tdmi 
6
7
/src/build/testecos/eCos/packages/hal/arm/arch/current/src/hal_misc.c
8
as: unrecognized option '-mcpu=arm7tdmi'
9
make[1]: *** [src/hal_misc.o.d] Error 1
10
11
*/

Vielleicht schränkt das den möglichen Fehler in der Installationsroutine 
ein.


Johann L. schrieb:
> Und warum werden binutils nicht installiert?
hatte diese Zeile vergessen. Die Binutils wurden erfolgreich 
installiert.

Nachdem ich in der Linuxwelt sehr neu bin, hab ich mich an diese etwas 
ältere Anleitung gehalten:
http://ecos.sourceware.org/build-toolchain.html

von Hans (Gast)


Lesenswert?

Johann L. schrieb:
> Warum nicht wie in der GCC-Doku für GMP/MPFR/MPC empfohlen?

wo findet man diese denn?

Hab hier im ersten pdf mal nachgeschaut, aber nichts über MPC oder MPFR 
etc. finden können.
http://gcc.gnu.org/onlinedocs/ --> GCC 4.7.1 Manual

von Hans (Gast)


Lesenswert?

hab`s jetzt nochmals probiert und bekomm den Fehler "mcpu=arm9" not 
recognized bereits beim Installieren der newlib.
1
/* ********** binutils ************* */
2
cd build
3
/binutils-2.22/configure --target=arm-eabi --prefix=/gnucompiler --enable-interwork --enable-multilib --with-gnu-as -with-gnu-ld
4
make
5
make install
6
7
/* erase build folder */
8
rm -rf *
9
10
/* ********** mpfr ************* */
11
12
../mpfr-3.1.1/configure --disable-shared --enable-static --prefix=/gnucompiler --with-gmp=/gnucompiler/
13
14
make && make check && make install
15
16
/* erase build folder */
17
rm -rf *
18
19
/* *********** mpc ************ */
20
21
../mpc-1.0/configure --disable-shared --enable-static --prefix=/gnucompiler --with-gmp=/gnucompiler/
22
23
24
make && make check && make install
25
26
/* erase build folder */
27
rm -rf *
28
29
/* ********* gcc ***************** */
30
31
../gcc-4.7.1/configure --target=arm-eabi --prefix=/gnucompiler/ --enable-interwork --enable-multlib --enable-languages="c" --with-newlib  --with-gnu-as --with-gnu-ld --with-cpu=arm9 --with-mpfr=/gnucompiler/
32
33
make all-gcc install-gcc
34
35
/* erase build folder */
36
rm -rf *
37
38
/* ********* newlib ************** */
39
40
../newlib-1.20.0/configure --target=arm-eabi --prefix=/gnucompiler --with-gnu-as --with-gnu-ld
41
42
make

Die Fehlermeldung ist dann folgende:
1
BUGREPORT=\"\" -DPACKAGE_URL=\"\" -I. -I../../../../../../newlib-1.20.0/newlib/libc/argz -DARM_RDI_MONITOR -fno-builtin      -g -O2  -mthumb -c -o lib_a-dummy.o `test -f 'dummy.c' || echo '../../../../../../newlib-1.20.0/newlib/libc/argz/'`dummy.c
2
as: unrecognized option '-mcpu=arm9'
3
make[8]: *** [lib_a-dummy.o] Error 1

Hat irgendwer noch eine Idee, an was das liegen könnte?

Hab im Netz noch diese Seite gefunden:
http://sources.redhat.com/ml/newlib/2003/msg00552.html

Wenn ich das danach mache, dann erhalte ich beim make Befehl von newlib 
die folgende Fehlermeldung:
1
" -DPACKAGE_URL=\"\" -I. -I../../../../../newlib-1.20.0/newlib/libc/argz -DARM_RDI_MONITOR -fno-builtin      -g -O2 -c -o lib_a-dummy.o `test -f 'dummy.c' || echo '../../../../../newlib-1.20.0/newlib/libc/argz/'`dummy.c
2
gcc: error trying to exec 'cc1': execvp: No such file or directory
3
make[5]: *** [lib_a-dummy.o] Error 1

Das soll angeblich ein Fehler sein, wenn der gcc nicht ordnungsgemäß 
installiert wurde.

Gruß
Hans

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hans schrieb:
> hab's jetzt nochmals probiert und bekomm den Fehler "mcpu=arm9" not
> recognized bereits beim Installieren der newlib.

Mögliche Fehlerquelle ist — wie oben bereits geschrieben — daß du nur 
Teile des Compilers generierst und installierst und andere weglässt. 
Damit erhält du natürlich keinen funktionsfähigen Compiler.  D.h. die 
Compiler-Kerne (cc1, cc1plus) funktionieren zwar, du kannst aber keine 
ablauffähigen Programme damit erzeugen.

Ein paar Grundregeln für GCC:

- Niemals in einem Unterverzeichnis der Quellen configure aufrufen

- Immer in einem leeren build-Verzeichnis generieren d.h.
  configure starten.  Vergiss "make clean" et. al!

- Auch für binutils wirds damit übersichtlicher

- Verwende für binutils und GCC die gleiche --prefix
  Ober verwendest zu einmal --prefix=/foo und einmal
  --prefix=/foo/  Ich weiß nicht ob das einen Unterschied macht,
  aber man muss es ja auch nicht drauf anlegen.

Die Abgängigkeiten GMP/MPFR/MPC löse ich am liebsten dadurch auf, indem 
sie zusammen mit GCC configured, erzeugt und installiert werden, siehe 
[1].  Damit erhalten sie ein mit GCC konsistentes configure, und es 
beeinflusst nicht die Systeminstallation.

Nach einfacher, als das Zeug von Hand runterzuladen, geht man ins 
GCC-Quellverzeichnis und führt folgendes Skript aus:
1
./contrib/download_prerequesities

Fertig!

Danach braucht man sich nicht mehr um das Zeugs zu kümmern und hat auch 
immer die für GCC empfohlene Version dieser Pakete.

Erst danach wird GCC configured; er erkennt dann daß diese Pakete da 
sind.

Analog kann man die newlib miterzeugen lassen.  Dazu linkst du die 
Quellen als "newlib" in die GCC-Quellen rein, analog zu den GMP et al. 
von oben.  Beachte dazu, daß das GCC-configure die Konfiguration der 
newlib macht, nicht das Tooplevel-configure der newlib.  D.d. du links 
nicht die oberste Ebene der newlib rein, sondern deren Unterverzeichnis 
newlib.

Ditto für libgloss falls gewünscht.

Die Kommandos sehen dann ungefähr so aus:

Als erstes besorgst du die Quellen und machst sie nach
1
./source/binutils-2.22
2
./source/gcc-4.7.1
3
./source/newlib-x.y.z

Dann klinkst du die Abhängigkeiten rein, dach sieht das GCC-Verzeichnis 
vereinfacht so aus:
1
./source/gcc-4.7.1/gmp
2
./source/gcc-4.7.1/mpfr
3
./source/gcc-4.7.1/mpc
4
./source/gcc-4.7.1/newlib

Dann erzeugst du die build-Verzeichnisse:
1
./build/binutils-2.22-arm-eabi
2
./build/gcc-4.7.1-arm-eabi

Und dann configure aus diesen Verzeichnissen
1
== binutils ==
2
cd build/binutils-2.22-arm-eabi
3
$ ../../binutils-2.22/configure --target=arm-eabi --prefix=/gnucompiler --enable-interwork
4
$ make
5
$ make install
1
== GCC ==
2
cd build/gcc-4.7.1-arm-eabi
3
$ ../../gcc-4.7.1/configure --target=arm-eabi --prefix=/gnucompiler --enable-interwork --enable-multilib --enable-languages="c" --with-cpu=arm9
4
$ make
5
$ make install

Und die Option heisst --enable-multilib, nicht --enable-multlib.  Bei 
den anderen Optionen gehe ich davon aus daß du weisst was zu tust.  Ich 
kenn kein ARM und kann nix dazu sagen.
 
> Hat irgendwer noch eine Idee, an was das liegen könnte?

Ja, steht schon oben. Und in meiner letzten Antwort.

> Das soll angeblich ein Fehler sein, wenn der gcc nicht ordnungsgemäß
> installiert wurde.

Ja, du erzeugst nur Teile davon, und installierst nur Teile davon. Keine 
gute Idee, es sei denn du brauchst sowas als GCC-Entwickler.


[1] http://gcc.gnu.org/install/download.html

von compcomp (Gast)


Lesenswert?

>hab`s jetzt nochmals probiert und bekomm den Fehler "mcpu=arm9" not
>recognized bereits beim Installieren der newlib.

leider zeigen Deine make-Aufrufe nicht, welcher Compiler
tatsächlich aufgerufen wird.

Vermutlich ist es der native Host-gcc der, nicht allzu überraschend,
die Option '-mcpu=arm9' micht kennt...

Vielleicht tut's

$ make CC=arm-eabi-gcc

(oder wie auch immer Dein selbst zusammengemuster gcc mit
vollem Namen heisst.)
Hast Du den Compiler überhaupt im PATH?

Sonst

$ make CC=/voller/pfad/zum/bin/arm-eabi-gcc

Was sagt

$ arm-eabi-gcc -v

?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.