Je vois quelque chose de vraiment bizarre dans un armel
environnement Debian chroot-ed .
Mais d'abord, un peu de trame de fond ... C'est long, mais la question est complexe et toute aide potentielle dépend de la connaissance de toute l'histoire.
J'ai un SoC ARM intégré qui exécute Linux - plus spécifiquement, un Debian armel
Lenny sur un noyau 2.6.17. La distribution Debian elle-même est facilement extensible aux versions ultérieures ( sudo apt-get dist-upgrade
) et peut donc être mise à jour, aux armel
versions de
squeeze
ou même wheezy
.
Le problème est que le noyau est personnalisé ... Le SoC ARM en question ne fait pas partie du noyau principal, il est donc quasiment abandonné en 2.6.17.
Si vous savez comment Linux et GLIBC fonctionnent, vous pouvez déjà voir le problème - les versions de GLIBC sont compilées avec une version de noyau minimale prise en charge ... qui a dépassé la 2.6.17. Donc, si nous essayons, par exemple, de chrooter sur une compression 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
... nous voyons un message du GLIBC de squeeze
, nous disant qu'il n'a pas été compilé pour fonctionner avec cet ancien noyau (2.6.17).
Le même problème se produit également avec Wheezy - car il est plus récent que Squeeze - et se produira en fait avec n'importe quelle version de Debian à partir de maintenant, car leur GLIBC ne fonctionnera pas sur mon noyau 2.6.17.
Au début, je pensais que c'était une rupture - mais ensuite j'ai réalisé que je pouvais en théorie recompiler GLIBC pour travailler avec l'ancien noyau que mon SoC utilise ... Mais j'aurais besoin d'un environnement identique à celui utilisé pour construire la libc6 par exemple dans Debian Squeeze.
Je suppose que la compilation de GLIBC et la préparation du fichier libc6_2.11.3-4.deb se font via une machine de compilation croisée automatisée inventée par les dieux de Debian.
Je ne suis pas Dieu ... et je n'ai rien trouvé sur Google pour savoir comment en devenir un - c'est-à-dire comment utiliser mon Core i5 en tant qu'hôte, pour compiler de manière croisée GLIBC en utilisant exactement les mêmes paramètres que la version packagée (à l'intérieur de Debian squeeze
). en utilisant.
Je l'ai donc trompé - j'ai compris comment configurer la version ARM de Debian Squeeze sur mon Core i5 (une technique qui utilise une version statique du qemu-arm
binaire).
Une fois que j'ai chrooté dans ma version hébergée par x86 Debian-armel-squeeze
, j'ai pu simplement ...
$ 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
... et après 3 heures (la version chrootée hébergée sur Core i5
Debian-armel-squeeze
est beaucoup plus lente qu'une machine native ...) j'ai reçu mon paquet libc6 .deb. Cela prendrait probablement 3 mois pour faire cette build dans mon SoC, donc je ne me plains pas.
En revenant à l'intérieur de mon vrai SoC ARM, j'ai copié tous les fichiers libc (.so) du nouveau paquet sur ceux par défaut de squeeze et j'ai essayé de chrooter ...
# chroot squeeze/
root@ttsiodras:/#
Oui! Ça a marché! (ou du moins ça semblait)
Ma libc personnalisée rapportée depuis l'intérieur du 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/>.
Les choses semblaient fonctionner - j'ai copié un fichier, invoqué ls
...
Mais quand j'ai essayé d'utiliser apt-get
pour installer certaines applications squeeze
, j'ai commencé à obtenir ... quelques erreurs inattendues:
# 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 tas de Function not implemented
. Cela ressemble à GLIBC rapportant que les choses de base ne fonctionnent pas ...
J'ai réussi à strace (ne demandez pas comment) et compris que toutes les -at
fonctions ne parviennent pas: openat
, mkdirat
, renameat
, etc - ils sont tous ENOSYS rapports.
Il semble que je n'ai réussi que partiellement - certains appels système échouent dans mon nouveau GLIBC.
Est-il impossible de compiler un squeeze
ou wheeze
GLIBC à exécuter sous 2.6.17?
Toute idée / indication sur ce que j'ai fait de mal et / ou comment procéder serait très appréciée ...