L’obiettivo di questa serie di articoli è di fornire una guida passo passo per la creazione da zero di un sistema GNU/Linux perfettamente funzionante,
applicabile ad esempio in scenari di tipo embedded come base per la generazione di un semplice BSP (Board Support Package), di un firmware Linux-based, o di una micro-distribuzione totalmente custom.
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2355 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Ho il compilatore GCC sotto /home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin ma lanciando la compilazione del kernel il link che lo punta sembra non essere visto. Di seguito quello che succede …. sapete darmi un aiuto ?
Grazie
cesare@ubuntu:~/Scaricati$ export PATH=$PWD/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin:$PATH
cesare@ubuntu:~/Scaricati$ $PATH
bash: /home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games: No such file or directory
cesare@ubuntu:~/Scaricati$ cd linux-3.5.4/
cesare@ubuntu:~/Scaricati/linux-3.5.4$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig
#
# configuration written to .config
#
cesare@ubuntu:~/Scaricati/linux-3.5.4$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
make: arm-linux-gnueabihf-gcc: Command not found
scripts/kconfig/conf –silentoldconfig Kconfig
make: arm-linux-gnueabihf-gcc: Command not found
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[1]: `include/generated/mach-types.h’ is up to date.
CC kernel/bounds.s
/bin/sh: 1: arm-linux-gnueabihf-gcc: not found
make[1]: *** [kernel/bounds.s] Error 127
make: *** [prepare0] Error 2
cesare@ubuntu:~/Scaricati/linux-3.5.4$ make ARCH=arm CROSS_COMPILE=/home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin/arm-linux-gnueabihf-
make: /home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin/arm-linux-gnueabihf-gcc: Command not found
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[1]: `include/generated/mach-types.h’ is up to date.
CC kernel/bounds.s
/bin/sh: 1: /home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin/arm-linux-gnueabihf-gcc: not found
make[1]: *** [kernel/bounds.s] Error 127
make: *** [prepare0] Error 2
cesare@ubuntu:~/Scaricati/linux-3.5.4$ ls -la /home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin/arm-linux-gnueabihf-gcc
lrwxrwxrwx 1 cesare cesare 29 feb 3 21:16 /home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin/arm-linux-gnueabihf-gcc -> arm-linux-gnueabihf-gcc-4.7.2
Cosa succede se provi a lanciare arm-linux-gnueabihf-gcc dalla shell, dopo aver impostato il path?
Forse ti manca qualche libreria richiesta dal compilatore; prova a dare un “ldd /home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin/arm-linux-gnueabihf-gcc” e vedere cosa ti dice.
ldd: /home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin/arm-linux-gnueabihf-: No such file or directory
cesare@ubuntu:~/Scaricati/linux-3.5.4$ ldd /home/cesare/Scaricati/gcc-linaro-arm-linux-gnueabihf-2012.09-20120921_linux/bin/arm-linux-gnueabihf-gcc
linux-gate.so.1 => (0xf7790000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf768d000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7661000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7645000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7640000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7622000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7478000)
/lib/ld-linux.so.2 (0xf7791000)
Ho risolto poco fa girando su forum ed era un problema analogo a quello che dicevi tu. Qualcuno aveva Ubuntu a 64 bit e non aveva installate le lib a 32 bit. Ho verificato di avere anch’io il SO a 64 bit visto che nemmeno lo sapevo ed ho installato le lib a 32
sudo apt-get install ia32.libs
Poi tutto è andato.
Grazie
Ottimo! Grazie per aver condiviso il modo in cui hai risolto. 😉
mi chiedevo….per fare delle prove senza avere fisicamente il raspberry, posso emularlo con Qemu?
E` possibile, ma e` necessaria una versione particolare di qemu, patchata per emulare tutti i componenti hardware del raspberry. Comunque e` piuttosto semplice, i passaggi sono tutti riportati qua:
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=72&t=26561
complimenti… guida sintetica ma esaustiva… ben fatto.
lanciando:
qemu-system-arm -M vexpress-a9 -kernel ./arch/arm/boot/zImage \ -serial stdio -display none -append “console=ttyAMA0”
appare il seguente errore:
qemu-system-arm: -kernel ./arch/arm/boot/zImage: Could not open ‘ -serial’: No such file or directory
Sto’ compilando con la toolchain dell’articolo, ma con l’attuale ultimo kernel. Puo’ essere questo il problema ?
Risposta un po’ tarda. Comunque io darei il comando tutto su una riga, senza usare il carattere ‘\’ (backslash).
La ricompilazione del kernel seguendo le istruzioni dell’articolo è andata bene, ma quando provo il kernel in qemu-system-arm non succede nulla: non vedo i classici messaggi di boot, non vedo proprio nessun messaggio, anche se aspetto molti minuti.
Ho provato anche a lanciare qemu senza collegare la seriale alla console e senza redirigere i messaggi del kernel alla seriale, cioè dando semplicemente:
$ qemu-system-arm -M vexpress-a9 -kernel ./zImage
e mi si apre una finestra di QEMU che resta nera e non succede nulla.
Viceversa, se provo a avviare lo stesso kernel da qemu-system-x86_64, con il comando:
$ qemu-system-x86_64 -kernel ./zImage
la finestra di QEMU che si apre è piena di caratteri e colori casuali, come si vede nell’immagine a questo link:
https://image-store.slidesharecdn.com/d4716a9b-5191-41bd-81b7-fff41258c3ce-medium.jpeg
E’ chiaro che un kernel per arm non può partire su una macchina x86_64, quindi il pasticcio di colori che si vede mi sta bene. Ma questo solo per dire che quando provo con qemu-system-arm mi aspetterei la stessa cosa, se il problema fosse del kernel. Invece ho come l’impressione che il problema sia proprio qemu-system-arm. La mia versione di QEMU è:
QEMU emulator version 2.8.1(Debian 1:2.8+dfsg-4+b1)
A qualcuno è mai capitato qualcosa del genere?
Ciao, sto seguendo tutto il procedimento passo passo, come indicato nell’ articolo ma dopo aver dato:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
ottengo:
amg@amg-Aspire-E5-571:~/linux-3.5.4$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[1]: “include/generated/mach-types.h” è aggiornato.
CC kernel/bounds.s
arm-linux-gnueabihf-gcc: error trying to exec ‘cc1’: execvp: File o directory non esistente
/home/amg/linux-3.5.4/./Kbuild:35: recipe for target ‘kernel/bounds.s’ failed
make[1]: *** [kernel/bounds.s] Error 1
Makefile:815: recipe for target ‘prepare0’ failed
make: *** [prepare0] Error 2
Please Help, non riescoa capire il perché
L’articolo e` un po’ vecchiotto e fa riferimento a toolchain e kernel un po’ datati. Io consiglierei di provare sia un kernel che una toolchain piu` recenti.
Ad esempio, su Ubuntu 18.04 e` possibile installare la toolchain per ARM con “sudo apt-get install gcc-arm-linux-gnueabihf”. Questo provvedra` anche a impostare il path (il comando “export PATH=…” non e` piu` necessario). Altre distro dovrebbero fornire un pacchetto in modo analogo.
Come kernel potrei consigliare l’ultimo stable da kernel.org:
https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.4.tar.xz
I comandi di make poi sono gli stessi.
Grande bella guida! a breve voglio provare a metterla in pratica anche con questi consigli aggiornati! ti farò sapere 🙂