cross compiling for mips architecture on ubuntu

Hi all,
I'm a complete newbie to cross compiling and I'm proceeding with the
usual trial and errors strategy. I'm trying to compile transmission
in order to install it on my Pirelli AGPF router, which has a MIPS
big-endian architecture and a BusyBox shell installed on it. I
downloaded the sources from transmission website and I gave the
following command:

./configure --prefix=$HOME/transmission
--build=x86_64-unknown-linux-gnu --host=mips-unknown-linux-gnu
--enable-daemon --enable-cli --enable-lightweight

The output of the script is readable on this pastebin:
http://pastebin.com/Y81VBy1g

After giving make and make install, the transmission-daemon binary
runs fine on ubuntu, but obviously not on the router (the system shell
tells me "applet not found"). The expected behaviour would be that the
binaries don't run on ubuntu but do on the embedded router.

Where am I wrong? What I am missing? Any pointer to a guide or a
how-to will be seriously appreciated.

Matteo

After giving make and make install, the transmission-daemon binary
runs fine on ubuntu,

Ciao,

sicuramente lo step "make all install" e` sbagliato in questo contesto,
il Makefile non puo` magicamente uploadare i binaries MIPS sul tuo
router....

Questo e` un passaggio che devi fare a mano. Purtroppo non conosco
il software e il router e quindi non so dirti come.

Prova a vedere se trovi i MIPS binaries da qualche parte nel tuo build
tree. Puoi usare il commando "file" per riconoscerli. Ecco l'output
di "file" eseguito su un eseguibile cross-compilato per PowerPC (x) e
uno "normale" x86-64 (y). Un MIPS non ce l'ho sotto mano....

x: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped

y: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

Quindi, sempre messo che hai ottenuto l'eseguibile MIPS (immagino di si`), poi
si tratta di uploadarlo sul router...

Bye,
Chris.

Ciao,
potresti provare a settare la variabile DESTDIR prima di eseguire make
install e installare tutto in una tua directory che usi poi per fare
l'upload sul router. Example: DESTDIR=~/my_mips_installdir/ make install

Hannes

Ciao Hannes e grazie della risposta,

i file compilati mi vengono già posizionati in una directory sotto
home, che ho impostato in uno dei parametri passati al file di
configurazione (--prefix=$HOME/transmission) in modo da evitare che mi
vadano a finire dentro la cartella /bin di sistema. Ho provato ad
usare il comando che ha suggerito Chris, che ringrazio di avermi fatto
conoscere, e l'output è stato il seguente:

$ file transmission-daemon
transmission-daemon: ELF 64-bit LSB executable, x86-64, version 1
(SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24,
BuildID[sha1]=0x1a54568a451857402002d9e65e2e905b975029cc, not stripped

Il che mi fa capire che nonostante al file di configurazione io abbia
passato i parametri:

--build=x86_64-unknown-linux-gnu --host=mips-unknown-linux-gnu

Il compilatore abbia compilato comunque per x86 e non per mips. Questo
è il motivo per cui transmission-daemon gira correttamente sul mio PC
ubuntu (e non dovrebbe, se fosse compilato per mips). Il mio sospetto
è che alla mia toolchain manchi qualcosa, anche se non capisco che
cosa. Infatti nel log che esce a video quando lancio il file di
configurazione (si può leggere per intero qui -->
http://pastebin.com/Y81VBy1g) ci sono alcune righe che secondo me
indicano l'assenza di qualche "componente" mancante del compilatore di
cui non conosco la natura, necessario per cross-compilare per
architettura mips. Ad esempio:

checking for mips-unknown-linux-gnu-strip... no

checking for mips-unknown-linux-gnu-gcc... no

checking for mips-unknown-linux-gnu-dumpbin... no
checking for mips-unknown-linux-gnu-link... no

checking for mips-unknown-linux-gnu-objdump... no

checking for mips-unknown-linux-gnu-dlltool... no

[eccetera....ma ce ne sono altri]

Il problema è che non ho la vaga idea di cosa vogliano dire questi
messaggi, e se ci sia il modo di "integrare" la mia installazione di
gcc, g++, binutils o quant'altro, con qualche libreria o componente di
altro tipo che permetta la compilazione per MIPS.

Any suggestion? :slight_smile:
M

Configure non trova il tuo cross compilatore. Dove hai installato il
cross compilatore per mips? Lo hai aggiunto al tuo $PATH?

Thomas

Ecco...inzio a capire dove sta l'inghippo. Ero convinto che gcc o g++
fossero già 'predisposti' per cross-compilare. Esisterà un comodo
pacchetto da scaricare dall'ubuntu software center con tutto il
toolchain per mips (allo stato attuale delle mie ricerche, mi pare di
no)? Oppure lo devo compilare da zero? In questo caso, tra le tante
guide che ho letto in questi giorni, ho trovato queste due:

http://www.linux-mips.org/wiki/Toolchains
https://wiki.debian.org/BuildingCrossCompilers

Quale è la più adatta? O c'è un'altra strada?

Non ho mai compilato per mips, ma la mia esperienza con GCC per AVR e
ARM su puo' riassumere in: mai e poi mai provare a compilare la GNU
toolchain da se.

Ho provato un paio di volte ed e' sempre finita con un sacco di tempo
perso. Se proprio non ci sono dei pacchetti pronti per la tua
distribuzione, allora potresti provare con embdebian oppure
crosstool-ng.

Non ho mai usato emdebian, quando ho cercato una via per ottenere un
compilatore ARM, ci ho dato un'occhiata. Forse non ho capito bene come
funziona, ma non mi e' sembrato un metodo un po' troppo complicato per i
miei gusti.

Crosstool-ng (http://crosstool-ng.org) dice di supportare mips, e per
ARM mi sono sempre trovato molto bene: scarichi lo script da internet,
lo configuri tramite un interfaccia tipo "make menuconfig" del kernel e
lo script si scarica le versioni compatibili di GCC, binutils,
$YOUR_FLAVOUR_OF_LIBC, gdb etc e compila tutto. Pero' non e' cosi'
pulito come installare un *.deb file, ma se metti il tuo compilatore
sotto la tua $HOME o in /usr/local/xtools oppure /opt allora e' facile
cancellarlo quando non ti serve piu'.

I miei 2 pence,
Thomas

Thomas, OTTIMO! Grazie mille per il puntatore. Certo, anche io
preferirei un bel pacchettino .deb che all'occorrenza si rimuove con
apt-get, ma non si può avere tutto dalla vita. Comunque le soluzioni
per non 'sporcare' troppo il sistema ci sono, come dicevi tu. Ora vedo
se così funziona. Nel frattempo mi sai dire se è possibile
decodificare quale 4-tupla devo scegliere tra le n-mila che ci sono?
(ho eseguito il comando ct-ng list-samples)

Ho visto che quelle papabili potrebbero essere queste:

[G.X] mips64el-n32-linux-uclibc
[G.X] mips64el-n64-linux-uclibc
[G.X] mips-ar2315-linux-gnu
[G..] mipsel-sde-elf
[G..] mipsel-unknown-linux-gnu
[G.X] mips-malta-linux-gnu
[G..] mips-unknown-elf
[G.X] mips-unknown-linux-uclibc

Dato che il Pirelli AGPF è big-endian, tenderei a scartare i vari
mipsel. Ma queste stringhe in formato A.B.C.D cosa rappresentano? A
immagino sia l'architettura della CPU, B il tipo di CPU, ma C e D?
Oltretutto alcune sono delle 3-tuple... Nel dubbio sarà il caso di
scegliere mips-unknown-elf?

per ora ho provato questo... : mips-unknown-linux-uclibc

domanda: come faccio a far capire allo script di configurazione del
programma che voglio compilare che voglio che venga usata la toolchain
creata da crosstool e non quella che ho già installata su ubuntu? devo
esportare qualche variabile d'ambiente per caso?

se così funziona. Nel frattempo mi sai dire se è possibile
decodificare quale 4-tupla devo scegliere tra le n-mila che ci sono?

L (Local) : sample was found in current directory
G (Global) : sample was installed with crosstool-NG
X (EXPERIMENTAL): sample may use EXPERIMENTAL features
B (BROKEN) : sample is currently broken

Io ho fatto un "ct-ng menuconfig" e selezionato
Target Options --->
   Target Architecture (mips)
   Endianness: (Big endian)
C-library --->
   C library (newlib)

La libreria da usare potrebbe dipende dal codice sorgente che usi.

Con questa configurazione ottengo:

bin/ct-ng show-tuple
   mips-unknown-elf

Nel dubbio sarà il caso di scegliere mips-unknown-elf?

E' quello a cui sono arrivato tramite il menuconfig. Ti consiglio di usare il
menuconfig, e' abbastanza user friendly, e' uguale al menuconfig del kernel
linux.

Thomas

Questo e' la parte difficile. Devi capire dalla documentazione del codice
sorgente la configurazione da utilizzare.

Assumendo che la configurazione sia "mips-unknown-linux-gnu". E' la
configurazione usata da te in una mail precedente -- non so se e' la
configurazione corretta!

Allora quando lanci in "configure" del tuo progetto, devi far in modo che il
cross compilatore viene trovato. Semplicemente aggiungi il path di
installazione del cross compilatore nel PATH:

PATH=/path/to/cross-gcc/bin ./configure --blah --blah --blah

Cioe' in /path/to/cross-gcc/bin si trovano mips-unknown-linux-gnu-gcc, mips-
unknown-linux-gnu-ld, mips-unknown-linux-as e compagni.

Spero che quello che ho scritto e' comprensibile. Le opzioni ci sono tante, e
quindi e' difficile dare indicazioni precise.

Thomas