Come fare Cross Compile per Raspberry Pi con Ubuntu X86

Qualche tempo fa, mentre stavo lavorando ad una ipotesi di progetto per un rilevatore sismico, mi sono trovato nella necessità di dover compilare un sorgente scritto in C per il mio Raspberry Pi. Inizialmente, tanto per rendere le cose semplici ed evitare di introdurre complessità inutili che mi avrebbero distratto dall'obbiettivo primario, avevo installato il sistema di sviluppo (il compilatore e tutto il resto) direttamente all'interno del Raspberry.

Poi però, non c'è voluto molto tempo per realizzare che questa soluzione era poco efficiente, oltre che poco pratica. Per cui ho iniziato a cercare come risolvere il problema del Cross Compile, generando codice eseguibile per il processore ARM del Raspberry usando il mio laptop Ubuntu con processore di architettura X86 (Intel i5).

Vediamo come fare, in questa semplice guida, la quale è stata scritta proprio con l'intenzione che sia di una qualche utiltà per tutti coloro che stanno iniziando a cimentarsi con Raspberry Pi

1. Installazione dei Build Tools

 

$ sudo apt-get install gcc-4.7-arm-linux-gnueabi

 

 2. Assicurati che il TOOL di Default per i Binari ARM sia quello corretto

Per essere sicuri che i Tools per ARM appena installati siano quelli di defaut, è necessario fissare il seguente link link simbolico

$ sudo ln -s /usr/bin/arm-linux-gnueabi-gcc-4.7 /usr/bin/arm-linux-gnueabi-gcc

... e verifica che il link sia stato creato correttamente ed al posto giusto

$ ls -l /usr/bin/arm-linux-gnueabi-gcc
lrwxrwxrwx 1 root root 34 feb  7 15:50 /usr/bin/arm-linux-gnueabi-gcc -> /usr/bin/arm-linux-gnueabi-gcc-4.7
$

Fatto!

Ora non resta che fare la prova sul campo con "helloworld.c"

3. Compilazione per ARM

Dal tuo PC con Ubuntu, utilizzando il tuo editor preferito, crea il file "helloworld.c"

/* Hello World program */
#include<stdio.h>
main()
{
    printf("Hello World\n"); } /* end-of-file */

 Salva il file e chiudi.

 Ora compila il file "helloworld.c" utilizzando il compilatore per ARM

$ arm-linux-gnueabi-gcc -o helloworld helloworld.c

Il quale, se non si sono verificati errori, produrrà il nuovo file eseguibile "helloworld", a patire dal file sorgente "helloworld.c".

$ ls -l
total 16
-rwxrwxr-x 1 dpm dpm 8424 feb  7 16:13 helloworld
-rw-rw-r-- 1 dpm dpm  104 feb  7 16:05 helloworld.c
$

Ovviamente, il file eseguibile appena generato non sarà possibile eseguirlo sul PC Ubuntu che abbiamo appena utilizzatoper la compilazione, in quanto il codice eseguibile non è interpretabile dal nostro PC (che quasi certamente è equipaggiato con un processore X86).

Se vuoi, puoi verificare, provando ad eseguirlo sul tuo PC, per vedere che succede. Proviamo:

$ ./helloworld 
-bash: ./helloworld: cannot execute binary file: Exec format error
$

Che altro non è che l'errore che effettivamente ci aspettavamo. Infatti, Exec format error, sta ald indicare che il formato dell'eseguibile non è compatibile con il nostro sistema e che quindi il nostro sistema non può eseguire il file binario (cannot execute binary file).

Se vuoi essere sicuro che il file binario eseguibile sia stato generato proprio per l'architettura ARM, non devi far altro che....

$ file helloworld
helloworld: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=b945ae496bd654c2d0e634adf9d1a710840d08c7, not stripped
$

Dal quale si scopre che il file binario è nel formato standard ELF a 32-bit e che è stato compilato per un'architettura ARM.

Et Voilà

4. Esecuzione in Raspberry Pi

Ora che il nostro file eseguibile di esempio è pronto, non dobbiamo far altro che trasferirlo sul nostro Raspberry Pi e verificare se veramente funziona.

Trasferisci il file eseguibile sul tuo Raspberry (nell'esempio il trasferimento è fatto con scp)

$ scp helloworld pi@192.168.0.201:
pi@192.168.0.201's password:
helloworld                                                                                  100% 8420     8.2KB/s   00:00    
$

Ora che finalmente il nostro file eseguibile di esempio [ stato trasferito sul Raspberry Pi, possiamo finalmente provare a collegargi al nostro Raspberry e verificare se lì funziona come ci si aspetta.

N.B. Nell'esempio viene effettuato un login al raspberry utilizzando per comodità il tool ssh.

$ ssh pi@192.168.0.201
pi@192.168.0.201's password:
Linux raspberrypi 4.1.6+ #810 PREEMPT Tue Aug 18 15:19:58 BST 2015 armv6l The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Feb  7 16:26:20 2017 from klamath
pi@raspberrypi ~ [1]$

Non ppena eseguito il login, è possibile provare ad eseguire il file "helloworld".

pi@raspberrypi ~ [1]$ ./helloworld 
Hello World
pi@raspberrypi ~ [2]$

 Il ché ci conferma che il nostro file di esempio "helloworld" è stato compilato in modo corretto e funziona egregiamente su una piattaforma ARM.

Mi auguro che questa sempice guida sia sufficientemente chiara e che soprattutto ti sia stata utile. Per qualsiasi chiarimento o approfondimento, non devi far altro che inserire un tuo commento in fondo a questo articolo.

Buon divertimento

 

 

Lascia un commento

Tutti i commenti dovranno essere verificati ed approvati dal webmaster, prima di essere pubblicati

Quote of the Day

Il bambino che non gioca non è un bambino, ma l’adulto che non gioca ha perso per sempre il bambino che ha dentro di sé.

Pablo Neruda

Chi è online

Abbiamo 89 visitatori e nessun utente online

Newsletter

Per essere sempre aggiornato sulle ultime novità.

Go to top