Mengkompilasi silang GLIBC untuk ARM SoC saya

13

Saya melihat sesuatu yang sangat aneh di dalam armellingkungan Debian yang chroot .

Tapi pertama-tama, sedikit cerita latar ... Ini panjang, tapi pertanyaannya kompleks dan bantuan potensial tergantung pada mengetahui cerita lengkapnya.

Saya memiliki SoC ARM tertanam yang menjalankan Linux - lebih khusus lagi, Debian armelLenny pada kernel 2.6.17. Distro Debian sendiri mudah di-upgrade ke versi yang lebih baru ( sudo apt-get dist-upgrade) dan dengan demikian dapat dinaikkan ke kecepatan, ke armelversi squeezeatau bahkan wheezy.

Masalahnya adalah kernel tersebut adalah kernel kustom ... SoC ARM yang dimaksud bukan bagian dari kernel arus utama, sehingga kernel ini cukup banyak ditinggalkan pada 2.6.17.

Jika Anda tahu cara kerja Linux dan GLIBC, Anda sudah dapat melihat masalahnya - Versi GLIBC dikompilasi dengan versi kernel minimum yang didukung ... Yang telah melewati 2.6.17. Jadi jika kita mencoba misalnya chroot ke squeeze 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

... kami melihat pesan dari GLIBC dari squeeze, yang memberi tahu kami bahwa itu tidak dikompilasi untuk bekerja dengan kernel lama ini (2.6.17).

Masalah yang sama terjadi pada wheezy, juga - karena ini lebih baru daripada memeras - dan sebenarnya akan terjadi dengan versi Debian mulai sekarang, karena GLIBC mereka tidak akan berfungsi pada kernel 2.6.17 saya.

Awalnya saya pikir ini adalah deal breaker - tetapi kemudian saya menyadari bahwa secara teori saya dapat mengkompilasi ulang GLIBC untuk bekerja dengan kernel lama yang digunakan oleh SoC saya ... Tapi saya membutuhkan lingkungan yang identik dengan apa yang digunakan untuk membangun libc6 paket dalam misalnya memeras Debian.

Saya menduga kompilasi GLIBC dan persiapan file libc6_2.11.3-4.deb dilakukan melalui mesin cross-compiling otomatis yang ditemukan oleh para Dewa Debian.

Saya bukan Tuhan ... saya juga tidak dapat menemukan apa pun di Google tentang cara menjadi satu - yaitu cara menggunakan Core i5 saya sebagai tuan rumah, untuk mengkompilasi silang GLIBC menggunakan pengaturan yang persis sama dengan versi paket (di dalam Debian squeeze) menggunakan.

Jadi saya menipu - saya menemukan cara mensetup versi ARM dari Debian yang ditekan pada Core i5 saya (sebuah teknik yang menggunakan versi qemu-armbiner yang statis ).

Setelah saya chroot dalam versi x86-host Debian-armel-squeezesaya, saya dapat dengan mudah ...

$ 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

... dan setelah 3 jam (versi Core i5-host chroot Debian-armel-squeezejauh lebih lambat daripada mesin asli ...) Saya mendapat paket libc6 .deb saya. Mungkin butuh 3 bulan untuk melakukan build ini di SoC saya, jadi saya tidak mengeluh.

Kembali ke dalam ARC SoC asli saya, saya menyalin semua file libc (.so) dari paket baru ke yang standar dari pemerasan dan mencoba chroot ...

# chroot squeeze/
root@ttsiodras:/# 

Iya! Berhasil! (atau begitulah tampaknya)

Libre kustom saya dilaporkan dari dalam 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/>.

Hal-hal tampaknya berhasil - Saya menyalin file, memanggil ls...

Tetapi ketika saya mencoba menggunakan apt-getuntuk menginstal beberapa aplikasi dari squeeze, saya mulai mendapatkan ... beberapa kesalahan tak terduga:

# 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 ... banyak Function not implemented. Kedengarannya seperti pelaporan GLIBC bahwa hal-hal dasar tidak berfungsi ...

Saya berhasil strace (jangan tanya bagaimana) dan tahu bahwa semua -atfungsi gagal: openat, mkdirat, renameat, dll - mereka semua ENOSYS pelaporan.

Tampaknya saya hanya berhasil sebagian - beberapa panggilan sistem gagal pada GLIBC baru saya.

Apakah tidak mungkin untuk mengkompilasi squeezeatau wheezeGLIBC untuk dieksekusi di bawah 2.6.17?

Setiap ide / petunjuk tentang apa yang saya lakukan salah dan / atau bagaimana melanjutkan akan sangat dihargai ...

ttsiodras
sumber
Menyiapkan kompiler silang tidaklah sulit dan ada tutorial di web untuk ini. Ini akan jauh lebih cepat daripada menjalankan compiler di Qemu. Saya tidak tahu apakah itu akan membantu libc yang dihasilkan tidak berfungsi.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles: Mengenai "tutorial" - dapatkah Anda menunjukkan sesuatu yang spesifik? Saya mencoba crosstool-ng tetapi tidak sejauh versi kernel target saya (2.6.17). Saya pikir ini relevan - glibc harus dikompilasi dengan header dari kernel saya (mungkin itulah yang menyebabkan masalah saya dalam build "berbasis ARM" saya ...)
ttsiodras

Jawaban:

7

Saya berhasil :-)

Saya pada dasarnya mengikuti saran Gilles dan memutuskan untuk melakukannya dengan benar: yaitu mengelola kompilasi silang lengkap GLIBC. Saya mulai dari crosstool-ng, dan pada awalnya kecewa - melihat bahwa itu tidak mendukung kernel lama saya. Saya tetap melakukannya, namun - secara manual mengedit file konfigurasi yang disimpan oleh crosstool-ng untuk melakukan perubahan seperti ini pada konfigurasi default arm-gnueabi build:

$ 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

Setelah banyak tes dan upaya gagal, perubahan di atas berhasil - saya mendapatkan versi kompilasi dari GLIBC yang akan bekerja dengan kernel saya, dan menyalin file yang dihasilkan ke mesin ARM Debian Lenny saya:

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

Aku pergi jauh-jauh dan bergerak melewati remasan: Aku debootstrap a / wheezy dan kemudian - dengan sangat hati-hati - menimpa versi GLIBC dari armel-debootstrap /wheezydengan milikku:

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

... dll, memastikan saya tidak ketinggalan perpustakaan yang dibagikan.

Akhirnya, saya menyalin ldddan ldconfigbinari (yang juga merupakan bagian dari GLIBC), dan chroot di / wheezy saya.

Itu berhasil.

Saya hanya dapat berasumsi bahwa kompilasi GLIBC dari emulasi qemu-arm chroot di dalam x86, entah bagaimana mengacaukan segalanya - mungkin configureproses mendeteksi beberapa hal dari lingkungan yang berjalan - sedangkan kompilasi silang tidak dapat disesatkan .

Jadi secara alami saya pindah ke langkah berikutnya, dan menggunakan shell busybox-static untuk mengganti folder {/ bin, / sbin, ...} dari lenny lama saya dengan yang wheezy - dan reboot ke Wheezy baru saya :-)

Saya dengan ini menyatakan bahwa WD MyBook World Edition saya adalah satu-satunya di planet ini yang menjalankan Debian Wheezy :-) Jika orang lain tertarik, saya dapat mengunggah tarball dari file libc di suatu tempat.

ttsiodras
sumber