Cross Compiling GLIBC für meinen ARM SoC

13

Ich sehe etwas wirklich Seltsames in einer chrooted Debian- armelUmgebung.

Aber zuerst ein bisschen Hintergrundgeschichte ... Das ist lang, aber die Frage ist komplex und jede mögliche Hilfe hängt davon ab, die ganze Geschichte zu kennen.

Ich habe einen eingebetteten ARM-SoC, der Linux ausführt - genauer gesagt einen Debian armelLenny auf einem 2.6.17-Kernel. Die Debian-Distribution selbst ist leicht auf spätere Versionen ( sudo apt-get dist-upgrade) aktualisierbar und kann so auf den neuesten Stand gebracht werden, auf die armelVersionen von squeezeoder sogar wheezy.

Das Problem ist, dass der Kernel benutzerdefiniert ist ... Der fragliche ARM-SoC ist nicht Teil des Hauptkernels, daher wird er in 2.6.17 so gut wie aufgegeben.

Wenn Sie wissen, wie Linux und GLIBC funktionieren, können Sie das Problem bereits erkennen - GLIBC-Versionen werden mit einer unterstützten Kernel-Mindestversion kompiliert ... Die Version ist weit über 2.6.17 hinausgegangen. Wenn wir also versuchen, zB zu einem Debian-Squeeze zu chrooten ...

$ # 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

... sehen wir eine Nachricht vom GLIBC von squeeze, die uns mitteilt, dass es nicht kompiliert wurde, um mit diesem alten Kernel (2.6.17) zu arbeiten.

Das gleiche Problem tritt auch bei Wheezy auf - da es neuer als squeeze ist - und wird in der Tat von nun an bei jeder Debian-Version auftreten, da deren GLIBC auf meinem 2.6.17-Kernel nicht mehr funktionieren wird.

Zuerst dachte ich, dies sei ein Deal Breaker - aber dann wurde mir klar, dass ich GLIBC theoretisch neu kompilieren kann, um mit dem älteren Kernel zu arbeiten, den mein SoC verwendet Paket in zB Debian squeeze.

Ich vermute, dass die Kompilierung von GLIBC und die Erstellung der libc6_2.11.3-4.deb-Datei über eine von den Göttern von Debian erfundene automatisierte Cross-Compiler-Maschinerie erfolgt.

Ich bin kein Gott ... noch konnte ich in Google etwas darüber finden, wie man einer wird - dh wie man meinen Core i5 als Host verwendet, um GLIBC mit genau den gleichen Einstellungen wie die Paketversion (in Debian squeeze) zu kompilieren mit.

Also habe ich es ausgetrickst - ich habe herausgefunden, wie man die ARM-Version von Debian Squeeze auf meinem Core i5 einrichtet (eine Technik, die eine statische Version der qemu-armBinärdatei verwendet).

Sobald ich in meiner x86-gehosteten Version von chrootete Debian-armel-squeeze, konnte ich einfach ...

$ 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

... und nach 3 Stunden (die von Core i5 gehostete chrooted-Version von Debian-armel-squeezeist viel langsamer als eine native Maschine ...) habe ich mein libc6 .deb-Paket erhalten. Es würde wahrscheinlich 3 Monate dauern, um diesen Build in meinem SoC zu erstellen, also beschwere ich mich nicht.

Zurück in meinem echten ARM-SoC habe ich alle libc-Dateien (.so) des neuen Pakets über die Standard-Squeeze-Dateien kopiert und versucht, chroot zu starten.

# chroot squeeze/
root@ttsiodras:/# 

Ja! Es funktionierte! (oder so schien es)

Meine benutzerdefinierte libc hat aus der chroot berichtet:

# /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/>.

Die Dinge schienen zu funktionieren - ich habe eine Datei kopiert, aufgerufen ls...

Aber als ich versuchte, apt-geteinige Apps von zu installieren squeeze, bekam ich ... einige unerwartete Fehler:

# 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 ... ein Haufen Function not implemented. Das klingt so, als würde GLIBC berichten, dass grundlegende Dinge nicht funktionieren ...

Ich Strace verwaltet (nicht fragen , wie) und herausgefunden, dass alle -atFunktionen versagen: openat, mkdirat, renameat, usw. - sie sind alle Berichte ENOSYS.

Es scheint, dass ich nur teilweise erfolgreich war - einige Systemaufrufe schlagen in meinem neuen GLIBC fehl.

Ist es unmöglich, a zu kompilieren squeezeoder wheezeGLIBC unter 2.6.17 auszuführen?

Alle Ideen / Hinweise, was ich falsch gemacht habe und / oder wie ich vorgehen soll, wären sehr dankbar ...

ttsiodras
quelle
Das Einrichten eines Cross-Compilers ist nicht allzu schwierig und es gibt Tutorials im Internet. Es ist deutlich schneller als der Compiler in Qemu. Ich weiß nicht, ob es helfen wird, wenn die resultierende libc nicht funktioniert.
Gilles 'SO - hör auf böse zu sein'
@ Gilles: In Bezug auf "Tutorials" - können Sie auf etwas bestimmtes verweisen? Ich habe Crosstool-ng ausprobiert, aber es geht nicht so weit zurück wie meine Ziel-Kernel-Version (2.6.17). Ich denke, das ist relevant - glibc muss mit Headern aus meinem Kernel kompiliert werden (vielleicht verursacht das meine Probleme in meinem "ARM-basierten" Build ...)
ttsiodras

Antworten:

7

Ich habe es gemacht :-)

Ich folgte im Grunde Gilles 'Rat und entschloss mich, es richtig zu machen: dh eine vollständige Cross-Compilation von GLIBC zu verwalten. Ich bin von Crosstool-ng ausgegangen und war anfangs enttäuscht, da es meinen alten Kernel nicht unterstützte. Ich habe mich jedoch daran gehalten - die von crosstool-ng gespeicherte Konfigurationsdatei manuell zu bearbeiten, um Änderungen wie diese an der Standardkonfiguration von arm-gnueabi vorzunehmen:

$ 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

Nach zahlreichen Tests und fehlgeschlagenen Versuchen haben sich die obigen Änderungen bewährt - ich habe eine kompilierte Version von GLIBC erhalten, die mit meinem Kernel funktionieren würde, und habe die resultierenden Dateien auf meine Debian Lenny ARM-Maschine kopiert:

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

Ich bin den ganzen Weg gegangen und bin an Squeeze vorbei gegangen: Ich habe ein / wheezy debootstrapped und dann - sehr vorsichtig - die GLIBC-Versionen des Armel-Debootstrapped /wheezymit meinem eigenen überschrieben :

# # 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
...

... usw., um sicherzustellen, dass ich keine gemeinsam genutzten Bibliotheken verpasst habe.

Schließlich habe ich die Binärdateien lddund ldconfig(die auch Teil von GLIBC waren) kopiert und in meinem / wheezy gechrootet.

Es funktionierte.

Ich kann nur davon ausgehen, dass die Kompilierung von GLIBC aus einer chroot-gesteuerten 'Qemu-Arm'-Emulation in einem x86-System die Dinge irgendwie durcheinander gebracht hat - vielleicht configureerkennt der Prozess einige Dinge aus der laufenden Umgebung -, während die Cross-Kompilierung nicht irregeführt werden kann .

So natürlich ich zum nächsten Schritt bewegt wird , und verwendet , um eine busybox-static Shell ersetzen die {/ bin, / sbin, ...} Ordner meiner alten lenny mit den wheezy diejenigen - und in meinem brandneuen Wheezy neu gestartet :-)

Ich behaupte hiermit, dass mein WD MyBook World Edition das einzige auf dem Planeten ist, auf dem Debian Wheezy läuft :-) Wenn jemand anderes daran interessiert ist, kann ich irgendwo ein Tarball der libc-Dateien hochladen.

ttsiodras
quelle