GLIBC a compilazione incrociata per il mio SoC ARM


13

Sto vedendo qualcosa di veramente strano in un armelambiente Debian chroot .

Ma prima, un po 'di retroscena ... Questo è lungo, ma la domanda è complessa e qualsiasi potenziale aiuto dipende dalla conoscenza dell'intera storia.

Ho un SoC ARM incorporato che esegue Linux - più specificamente, un Debian armelLenny su un kernel 2.6.17. La distro Debian stessa è facilmente aggiornabile alle versioni successive ( sudo apt-get dist-upgrade) e può quindi essere portata alla velocità, alle armelversioni squeezeo addirittura wheezy.

Il problema è che il kernel è personalizzato ... Il SoC ARM in questione non fa parte del kernel mainline, quindi è praticamente abbandonato a 2.6.17.

Se sai come funzionano Linux e GLIBC, puoi già vedere il problema: le versioni GLIBC sono compilate con una versione minima supportata del kernel ... Che è passato oltre 2.6.17. Quindi se proviamo ad esempio chroot a una compressione Debian ...

$ # From inside the little ARM machine running Debian Lenny
$ sudo debootstrap --arch armel squeeze /squeeze \
     http://ftp.whateverCountry.debian.org/debian
$ sudo -i
# mount -t proc none /squeeze/proc
# mount -t sysfs none /squeeze/sys
# mount -t devpts none /squeeze/dev/pts
# chroot /squeeze
Fatal: Kernel too old

... vediamo un messaggio del GLIBC di squeeze, che ci dice che non è stato compilato per funzionare con questo vecchio kernel (2.6.17).

Lo stesso problema si verifica anche con wheezy - poiché è più recente di squeeze - e in effetti accadrà con qualsiasi versione di Debian da ora in poi, poiché il loro GLIBC non funzionerà sul mio kernel 2.6.17.

All'inizio ho pensato che questo fosse un rompicapo, ma poi ho capito che in teoria posso ricompilare GLIBC per lavorare con il kernel più vecchio che il mio SoC sta usando ... Ma avrei bisogno di un ambiente identico a quello che è stato usato per compilare libc6 pacchetto ad esempio in Debian squeeze.

Sto indovinando la compilazione di GLIBC e la preparazione del file libc6_2.11.3-4.deb viene effettuata tramite un sistema di compilazione automatica incrociato inventato dagli dei di Debian.

Non sono un dio ... né potrei trovare nulla su Google su come diventare uno - come usare il mio Core i5 come host, per compilare in modo incrociato GLIBC usando le stesse impostazioni della versione del pacchetto (all'interno di Debian squeeze) utilizzando.

Quindi l'ho ingannato: ho capito come impostare la versione ARM di Debian squeeze sul mio Core i5 (una tecnica che utilizza una versione statica del qemu-armbinario).

Una volta che ho eseguito il chroot nella mia versione x86 ospitata Debian-armel-squeeze, sono stato in grado di ...

$ cd /var/tmp
$ apt-get source libc6
...
$ # edit this in - compile for my kernel...
$ vi eglibc-2.11.3/debian/sysdeps/linux.mk
...
MIN_KERNEL_SUPPORTED := 2.6.17
...
$ export DEB_BUILD_OPTS="nocheck parallel=1"
$ cd eglibc-2.11.3
$ dpkg-buildpackage -b -d -us -uc

... e dopo 3 ore (la versione chroot ospitata da Core i5 Debian-armel-squeezeè molto più lenta di una macchina nativa ...) ho ricevuto il mio pacchetto .deb di libc6. Probabilmente occorrerebbero 3 mesi per eseguire questa build nel mio SoC, quindi non mi lamento.

Tornando all'interno del mio vero SoC ARM, ho copiato tutti i file libc (.so) del nuovo pacchetto su quelli predefiniti di squeeze e ho provato a chroot ...

# chroot squeeze/
root@ttsiodras:/# 

Sì! Ha funzionato! (o almeno così sembrava)

La mia libc personalizzata segnalata dall'interno del chroot:

# /lib/libc.so.6 
GNU C Library (Debian EGLIBC 2.11.3-4) stable release version 2.11.3, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.5.
Compiled on a Linux 2.6.26 system on 2014-10-23.
Available extensions:
        crypt add-on version 2.1 by Michael Glad and others
        GNU Libidn by Simon Josefsson
        Native POSIX Threads Library by Ulrich Drepper et al
        Support for some architectures added on, not maintained in glibc core.
        BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.

Le cose sembravano funzionare - ho copiato un file, invocato ls...

Ma quando ho provato a utilizzare apt-getper installare alcune app squeeze, ho iniziato a ottenere ... alcuni errori imprevisti:

# apt-get install indent
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
  indent
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 110 kB of archives.
After this operation, 516 kB of additional disk space will be used.
Get:1 http://ftp.gr.debian.org/debian/ squeeze/main indent armel 2.2.11-1 [110 kB]
Fetched 110 kB in 0s (236 kB/s)

tar: ./control: Cannot utime: Function not implemented
tar: ./md5sums: Cannot utime: Function not implemented
tar: .: Cannot utime: Function not implemented
tar: Exiting with failure status due to previous errors

dpkg-deb: subprocess tar returned error exit status 2
dpkg: error processing /var/cache/apt/archives/indent_2.2.11-1_armel.deb (--unpack):
 subprocess dpkg-deb --control returned error exit status 2
configured to not write apport reports

rm: cannot remove `/var/lib/dpkg/tmp.ci': Function not implemented

dpkg: error while cleaning up:
 subprocess rm cleanup returned error exit status 1
Errors were encountered while processing:
 /var/cache/apt/archives/indent_2.2.11-1_armel.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Oh-oh ... un mucchio di Function not implemented. Sembra che GLIBC riferisca che le cose di base non funzionano ...

Sono riuscito a strace (non chiedete come) e capito che tutte le -atfunzioni stanno fallendo: openat, mkdirat, renameat, ecc - sono tutti ENOSYS di reporting.

Sembra che abbia avuto solo parzialmente successo - alcune chiamate di sistema non riescono nel mio nuovo GLIBC.

È impossibile compilare un squeezeo wheezeGLIBC da eseguire in 2.6.17?

Qualche idea / suggerimento su ciò che ho fatto di sbagliato e / o su come procedere sarebbe molto apprezzato ...


Configurare un compilatore multiplo non è poi così difficile e ci sono tutorial sul web per questo. Sarà significativamente più veloce dell'esecuzione del compilatore in Qemu. Non so se aiuterà con la libc risultante che non funziona.
Gilles 'SO- smetti di essere malvagio' il

@Gilles: Riguardo ai "tutorial", puoi indicare qualcosa di specifico? Ho provato crosstool-ng ma non risale alla versione del mio kernel di destinazione (2.6.17). Penso che questo sia pertinente - glibc deve essere compilato con le intestazioni del mio kernel (forse è questo che sta causando i miei problemi nella mia build "ARM-based" ...)
ttsiodras

Risposte:


7

Ce l'ho fatta :-)

Fondamentalmente ho seguito il consiglio di Gilles e ho deciso di farlo correttamente: cioè gestire una compilazione incrociata completa di GLIBC. Ho iniziato da crosstool-ng e inizialmente sono rimasto deluso, visto che non supportava il mio vecchio kernel. Ho continuato a farlo, però - modificando manualmente il file di configurazione salvato da crosstool-ng per fare cambiamenti come questi sulla configurazione di build predefinita di arm-gnueabi:

$ ct-ng arm-unknown-linux-gnueabi
$ ct-ng menuconfig
...
$ vi .config
$ cat .config
...
CT_KERNEL_VERSION="2.6.17"
CT_KERNEL_V_2_6_17=y
CT_LIBC_VERSION="2.13"
CT_LIBC_GLIBC_V_2_13=y
CT_LIBC_GLIBC_MIN_KERNEL_VERSION="2.6.9"
CT_LIBC_GLIBC_MIN_KERNEL="2.6.9
...
$ ct-ng +libc

Dopo numerosi test e tentativi falliti, le modifiche di cui sopra lo hanno fatto: ho ottenuto una versione compilata di GLIBC che avrebbe funzionato con il mio kernel e ho copiato i file risultanti sulla mia macchina Debian Lenny ARM:

$ cd .build/arm-unknown-linux-gnueabi/build/build-libc-final/
$ tar zcpf newlibc.tgz $(find . -type f -iname \*.so)
$ scp newlibc.tgz root@mybook:.

Sono andato fino in fondo e ho passato la compressione: ho debootstrapped a / wheezy e poi - con molta attenzione - ho sovrascritto le versioni GLIBC dell'armel-debootstrapped /wheezycon il mio:

# # In the ARM machine
# cd /wheezy/lib/arm-linux-gnueabi/
# mv /var/tmp/ohMyGod/libc.so libc-2.13.so
# mv /var/tmp/ohMyGod/rt/librt.so librt-2.13.so
...

... ecc., assicurandomi di non perdere nessuna libreria condivisa.

Alla fine, ho copiato i binari ldde ldconfig(che erano anche parte di GLIBC) e sono stato chroot all'interno di my / wheezy.

Ha funzionato.

Posso solo supporre che la compilazione di GLIBC da un'emulazione di 'qemu-arm' basata su chroot all'interno di un x86, in qualche modo ha incasinato le cose - forse il configureprocesso rileva alcune cose dall'ambiente in esecuzione - mentre la compilazione incrociata non può essere fuorviata .

Quindi, naturalmente, sono passato al passaggio successivo e ho usato una shell staticbox per sostituire le cartelle {/ bin, / sbin, ...} del mio vecchio lenny con quelle sibilanti - e ho riavviato il mio nuovo Wheezy :-)

Con la presente dichiaro che il mio WD MyBook World Edition è l'unico al mondo che esegue Debian Wheezy :-) Se qualcun altro è interessato, posso caricare un tarball dei file libc da qualche parte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.