web-dev-qa-db-ja.com

私のARM SoCのGLIBCをクロスコンパイルする

ChrootされたDebian armel環境内で本当に奇妙な何かを見ています。

しかし、最初に、ちょっとした裏話...これは長いですが、質問は複雑であり、潜在的な助けはすべての話を知ることによって決まります。

組み込みのARM Linuxを実行するSoC-より具体的には、2.6.17カーネル上のDebian armelLenny。Debianディストリビューション自体は、新しいバージョン(Sudo apt-get dist-upgrade)、つまりarmelバージョンのsqueezeまたはwheezyまで高速化できます。

問題は、カーネルがカスタムカーネルであるということです...問題のARM= SoCはメインラインカーネルの一部ではないため、2.6.17ではかなり見捨てられています。

LinuxとGLIBCがどのように機能するかを知っていれば、問題をすでに確認できます。GLIBCバージョンは、サポートされている最小のカーネルバージョンでコンパイルされています...これは2.6.17を超えています。したがって、たとえば、 Debianスクイーズにchroot ...

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

...squeezeのGLIBCからのメッセージが表示され、この古いカーネル(2.6.17)で動作するようにコンパイルされていないことが通知されます。

Squeezeよりも新しいため、同じ問題がwheezyでも発生します。実際、GLIBCが私の2.6.17カーネルで動作しないため、これからのすべてのDebianバージョンで発生します。

最初はこれが取引ブレーカーだと思った-しかし、私は理論上を再コンパイルして、SoCが使用している古いカーネルで動作するようにできることに気付いた...しかし、同じ環境が必要例:libc6パッケージのビルドに使用されたものDebian squeeze。

GLIBCのコンパイルとlibc6_2.11.3-4.debファイルの準備は、Debianの神々によって発明された自動クロスコンパイル機構によって行われていると思います。

私は神ではありません...どのようにして1つになるか、つまり、Core i5をホストとして使用し、パッケージバージョンとまったく同じ設定を使用してGLIBCをクロスコンパイルする方法(Debian内でsqueeze)が使用しています。

だから私はそれをだました-私はCore i5でARMバージョンのDebian squeezeをセットアップする方法を見つけました(qemu-armバイナリの静的バージョンを使用するテクニック)。

X86でホストされているバージョンのDebian-armel-squeezeでchrootしたら、簡単に...

$ 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

...そして3時間後(Debian-armel-squeezeのCore i5でホストされたchrootバージョン)は、ネイティブマシンよりもはるかに遅くなります...)libc6 .debパッケージを取得しました。私のSoCでこのビルドを行うにはおそらく3か月かかるので、不満はありません。

私の本当のARM= SoCの内部に戻って、新しいパッケージのすべてのlibcファイル(.so)をsqueezeのデフォルトのファイルにコピーし、chrootしようとしました...

# chroot squeeze/
root@ttsiodras:/# 

はい!出来た! (またはそう思われた)

私のカスタムlibcは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/>.

うまくいったようです-lsを呼び出してファイルをコピーしました...

しかし、apt-getを使用してsqueezeからいくつかのアプリをインストールしようとすると、予期しないエラーが発生し始めました:

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

おおおお…たくさんのFunction not implemented。これは、GLIBCが基本的なものが機能していないと報告しているようです...

私はなんとかトレース(方法は問わない)し、すべての-at関数が失敗していることがわかりました:openatmkdiratrenameatなど-それらすべてENOSYSを報告しています。

私は部分的にしか成功しなかったようです-新しいGLIBCで一部のシステムコールが失敗しています。

squeezeまたはwheeze GLIBCをコンパイルして2.6.17で実行することは不可能ですか?

私が間違ったことおよび/またはどのように進めるかについてのアイデア/ポインタは大いに感謝されます...

13
ttsiodras

やった :-)

私は基本的にGillesのアドバイスに従い、それを適切に行うことにしました。つまり、GLIBCの完全なクロスコンパイルを管理します。私はcrosstool-ngから始めましたが、最初はがっかりしました。古いカーネルをサポートしていないことがわかりました。しかし、私はそれを続けました-デフォルトのarm-gnueabiビルド構成で次のような変更を行うために、crosstool-ngによって保存された構成ファイルを手動で編集します。

$ 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

数多くのテストと試行の失敗の後に、上記の変更がそれを行いました-私のカーネルで動作するコンパイルされたバージョンのGLIBCを取得し、結果のファイルをDebian Lenny ARM machine:

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

私はずっと行き、squeezeを越えて移動しました:/ wheezyをデブートストラップしてから、非常に慎重に、armel-debootstrappedのGLIBCバージョンを上書きしました/wheezy自分で:

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

...など、共有ライブラリを見逃していないことを確認します。

最後に、lddおよびldconfigバイナリ(これらもGLIBCの一部)をコピーし、/ wheezy内にchrootしました。

出来た。

私は、x86内のchrootされた「qemu-arm」エミュレーションからのGLIBCのコンパイルがどういうわけか台無しにしたことを仮定することができます-多分configureプロセスは実行環境からいくつかのものを検出しますが、クロスコンパイルを誤解させることはできません。

だから私は当然次のステップに移動し、busybox-staticシェルを使用してreplaceの{/ bin、/ sbin、...}フォルダを私の古いレニーとwheezyのもの-そして私の新しいWheezyに再起動しました:-)

私のWD MyBook World Edition は、Debian Wheezyを実行している地球上で唯一のものであると私はここに主張します:-)他の誰かが興味があれば、どこかにlibcファイルのtarballをアップロードできます。

7
ttsiodras