# Crosscompile CFLAGS & CHOST

## LinuxTom

Hallo Leute,

bisher bin ich immer ohne diese Sache ausgekommen. Hintergrund: Ich kompiliere auf meinem i7-System auch mein Gentoo für meinen Atom-Prozessor. Mit der nun "neuen" GCC-Version 4.5.3 habe ich mal "-march=atom" versucht und prompt kommt "ungültiger Maschinenbefehl".

Liegt das an unterschiedlichen CHOST-Einträgen (i7=x86_64-pc-linux-gnu und Atom=i686-pc-linux-gnu)? Ich vermute mal ja und diese Seite sollte mein Freund sein. Und da meine Frage wie Eure Erfahrungen sind. Würdet Ihr mir zu "Creating a Cross-Compiler" oder zu "Cross-Compiling With Portage" raten. Ich würde es ja lieber mit Portage machen, da "kümmern" sich dann ja mehrere drum.  :Wink: 

Oder an etwas anderem? Andere HowTo's?

Und was ich gerade fand ist diese Seite. Da nun meine Frage: Gibt es ein HowTo ein laufendes System im CHOST umzustellen oder muss ich da Gentoo neu aufsetzen. Das wäre echt blöd. Lieber CHOST umsetzen und "emerge -e word" und gcc, binutils und glibc vorziehen.

----------

## Treborius

1. wie kompilierst du denn für den atom?

distcc oder was? ich weiss gerade nicht worum es bdabei geht ...

2. deine beiden CHOSTS sind grundverschieden, einer ist ein 64bit system, das andere ist 32bit

das sorgt bei mir für weitere verwirrung

ich kann garnicht verstehen, wie du bisher OHNE crosscompiler ausgekommen bist,

auch ohne neuen gcc

bitte mehr details, was du unter

 *Quote:*   

> 
> 
> Hintergrund: Ich kompiliere auf meinem i7-System auch mein Gentoo für meinen Atom-Prozessor.
> 
> 

 

verstehst

was du meinst ist mir klar, aber nicht auf welchem weg

edit : zu der frage nach dem ändern von CHOST :

das geht, habs selber schon gemacht www.gentoo.org/doc/en/change-chost.xml

aber damit kannst du nicht einfach von 32bit auf 64bit wechseln (oder umgekehrt)

----------

## LinuxTom

 *Treborius wrote:*   

> deine beiden CHOSTS sind grundverschieden, einer ist ein 64bit system, das andere ist 32bit
> 
> das sorgt bei mir für weitere verwirrung

 

Bisher ohne Probleme da ich in einer i686-chroot gearbeitet habe und da mein CFLAGS nicht für den Atom waren.

 *Quote:*   

> www.gentoo.org/doc/en/change-chost.xml

 

Prima, genau das habe ich gesucht.

 *Quote:*   

> aber damit kannst du nicht einfach von 32bit auf 64bit wechseln (oder umgekehrt)

 

Und wieso nicht?

----------

## Treborius

 *Quote:*   

> aber damit kannst du nicht einfach von 32bit auf 64bit wechseln (oder umgekehrt)

 

in einer chroot habe ich das noch nicht versucht

ich habe damals versucht ein laufendes system umzustellen

ohne erfolg

in einer chroot könnte das vllt sogar gehen

----------

## LinuxTom

 *Treborius wrote:*   

> in einer chroot könnte das vllt sogar gehen

 

Aber leider auch nicht mit dieser Anleitung ohne Änderung. Mal sehen. Ganz habe ich es noch nicht aufgegeben.

----------

## Treborius

 *LinuxTom wrote:*   

>  *Treborius wrote:*   in einer chroot könnte das vllt sogar gehen 
> 
> Aber leider auch nicht mit dieser Anleitung ohne Änderung. Mal sehen. Ganz habe ich es noch nicht aufgegeben.

 

in welche richtung soll es denn gehen?

64bit ==> 32 bit?

----------

## LinuxTom

Jetzt noch i686 dann x86_64.

Aber das ist nicht so einfach. Ich müsste wohl über Stage 1 und 2. Da ich derzeit jedoch keine Zeit habe sieht mein jetziges Szenario erst einmal so aus:

Auf einem 64-Bit Host (Intel) richte ich eine minimale 64-Bit-Chroot ein, um in dieser die Binaries für meinen Atom zu erzeugen.

In dieser 64-Bit-Chroot richte ich einen Cross-Compiler für i686 ein und mit speziellen CFLAGS. Bspw. -march=atom.

Zusammenstellen des Systems und erzeugen der Binaries.

Verteilen der 32-Bit-Binaries auf meinen kleinen MSI-Laptop.

Ich werde einfach eine neue 64-Bit-Chroot installieren. Geht letztlich schneller, zumal derzeit meine Zeit sehr knapp ist.

----------

## firefly

wiso ein 64bit chroot? Du kannst doch gleich ein 32Bit chroot erstellen.

----------

## LinuxTom

Eine 32-Bit-Chroot verwende ich ja jetzt schon, doch da kommt halt "ungültiger Maschinenbefehl", wenn ich "-march=atom" nehme (CHOST="i686-pc-linux-gnu"). Wenn es einfacher geht, dann sprich. Es kann natürlich auch sein, dass alle Mozilla-Programme, denn das sind die ganzen Programme die damit nicht klar kommen, nur das Problem haben.

```
i686-pc-linux-gnu-g++ -o nsMemoryReporterManager.o -c -I../../dist/system_wrappers -include ../../config/gcc_hidden.h -DMOZILLA_INTERNAL_API -DMOZ_THUNDERBIRD=1 -DOSTYPE=\"Linux2.6\" -DOSARCH=Linux -D_IMPL_NS_COM -I./../build -I. -I. -I../../dist/include -I../../dist/include/nsprpub  -I/usr/include/nspr -I/usr/include/nss      -I/usr/include   -fPIC  -I/usr/include -fno-rtti -fno-handle-exceptions  -Wpointer-arith -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor -Wcast-align -Wno-invalid-offsetof -Wno-long-long -pipe -march=atom -mtune=atom -Wno-return-type -w -fno-strict-aliasing -fshort-wchar -pthread -pipe  -DNDEBUG -DTRIMMED -O2 -pthread -D_REENTRANT -DQT_SHARED -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng15 -I/usr/include/qt4 -I/usr/include/qt4/QtGui -I/usr/include/libdrm -I/usr/include/qt4/QtCore -I/usr/include/gtk-unix-print-2.0    -I/usr/include -DMOZILLA_CLIENT -include ../../mozilla-config.h -Wp,-MD,.deps/nsMemoryReporterManager.pp nsMemoryReporterManager.cpp

nsIConsoleListener.idl

/tmp/pool/msi/portage/x11-plugins/enigmail-1.1.2-r2/work/comm-1.9.2/mozilla/dist/bin/xpidl -m typelib -w -I. -I../../dist/idl -e _xpidlgen/nsIConsoleListener.xpt -d .deps/nsIConsoleListener.pp nsIConsoleListener.idl

nsIConsoleMessage.idl

/tmp/pool/msi/portage/x11-plugins/enigmail-1.1.2-r2/work/comm-1.9.2/mozilla/dist/bin/xpidl -m typelib -w -I. -I../../dist/idl -e _xpidlgen/nsIConsoleMessage.xpt -d .deps/nsIConsoleMessage.pp nsIConsoleMessage.idl

make[2]: *** [_xpidlgen/nsIConsoleListener.xpt] Illegal instruction

make[2]: *** Deleting file `_xpidlgen/nsIConsoleListener.xpt'

make[2]: *** Waiting for unfinished jobs....

make[2]: *** [_xpidlgen/nsIConsoleMessage.xpt] Illegal instruction

make[2]: *** Deleting file `_xpidlgen/nsIConsoleMessage.xpt'

nsIConsoleService.idl

/tmp/pool/msi/portage/x11-plugins/enigmail-1.1.2-r2/work/comm-1.9.2/mozilla/dist/bin/xpidl -m typelib -w -I. -I../../dist/idl -e _xpidlgen/nsIConsoleService.xpt -d .deps/nsIConsoleService.pp nsIConsoleService.idl

make[2]: *** [_xpidlgen/nsIConsoleService.xpt] Illegal instruction

make[2]: *** Deleting file `_xpidlgen/nsIConsoleService.xpt'

make[2]: Leaving directory `/tmp/pool/msi/portage/x11-plugins/enigmail-1.1.2-r2/work/comm-1.9.2/mozilla/xpcom/base'

make[1]: *** [libs] Error 2

make[1]: Leaving directory `/tmp/pool/msi/portage/x11-plugins/enigmail-1.1.2-r2/work/comm-1.9.2/mozilla/xpcom'

make: *** [default] Error 2

make: Leaving directory `/tmp/pool/msi/portage/x11-plugins/enigmail-1.1.2-r2/work/comm-1.9.2/mozilla/xpcom'

emake failed
```

----------

## LinuxTom

So, nachdem ich mich u.a. durch dieses hier gewühlt habe eine Frage:

Wie kann ich die CFLAGS für das Cross-Compiling-Binary ändern? Bei mir bleibt dieses konstant auf

```
CFLAGS="-Os -pipe  -fomit-frame-pointer -I/usr/i686-pc-linux-gnu/usr/include/ -I/usr/i686-pc-linux-gnu/include/"
```

Die Angabe in /usr/i686-pc-linux-gnu/etc/make.conf greift nicht.  :Sad: 

----------

