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 (con un processore Intel i5).
Vediamo come fare, in questa semplice guida, la quale è stata scritta proprio con l’intenzione che sia di una qualche utilità per tutti coloro che stanno iniziando a cimentarsi con Raspberry Pi.
Passo 1. Installazione dei Build Tools
Prima di tutto, avrai bisogno di installare i Build Tools nella macchina GNU Linux di sviluppo.
$ sudo apt-get install gcc-4.7-arm-linux-gnueabi
Passo 2. Tool per processori ARM
Innanzi tutto, 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 default, è 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 il codice sorgente del programma helloworld.c
.
Passo 3. Compilazione per ARM
Dal tuo PC con Ubuntu, utilizzando il tuo editor preferito, crea il file helloworld.c
come esempio di compilazione.
/* Hello World program */ include main() { printf("Hello World\n"); } /* end-of-file */
Salva il file e chiudi.
Ora compila il file helloworld.c
utilizzando il compilatore per ARM con questo comando:
$ 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
, come mostrato qui sotto.
$ 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 ad 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 ispezionare il formato del contenuto del file, con il comando file
di Linux.
$ 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.
Passo 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 Joy pi@raspberrypi ~ [1]$
Non appena 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 semplice 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
Disclaimer
Questa pagina potrebbe contenere link di affiliazione. Gli acquisti o gli ordini che effettuerai tramite tali link possono generare commissioni che ci aiutano a sostenere questo sito web.