ARM SoC用のGLIBCのクロスコンパイル


13

chrootで管理されたDebian armel環境で本当に奇妙なものを見ています。

しかし、最初に、少し裏話があります...これは長いですが、質問は複雑であり、潜在的な助けはすべてのストーリーを知ることにかかっています。

Linuxを実行する組み込みARM SoCがありarmelます。具体的には、2.6.17カーネル上のDebian Lennyです。Debianディストリビューション自体は、後のバージョン(sudo apt-get dist-upgrade)に簡単にアップグレードできるため、armelバージョン、squeezeまたはバージョンに合わせ て高速化できwheezyます。

問題は、カーネルがカスタムカーネルであるということです...問題のARM SoCはメインラインカーネルの一部ではないため、2.6.17でほぼ放棄されています。

LinuxとGLIBCがどのように機能するかを知っていれば、すでに問題を確認できます-GLIBCバージョンは、サポートされている最小カーネルバージョンでコンパイルされています... たとえば、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

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

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

最初はこれが契約違反だと思いました-しかし、理論的にはSoCが使用している古いカーネルで動作するようにGLIBCを再コンパイルできること気付きました...しかし、libc6の構築に使用した環境と同じ環境が必要ですDebian squeezeなどのパッケージ。

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

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

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

のx86ホストバージョンでchrootすると、Debian-armel-squeeze簡単にできました...

$ 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時間後(Core i5-hosted chrootedバージョンの Debian-armel-squeezeネイティブマシンよりもはるかに遅い...)私は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が基本的なことは機能していないと報告しているように聞こえます...

私はstraceのに管理(どのように聞いていない)と、すべてのことを考え出した-at関数が失敗している:openatmkdiratrenameat、など-彼らはすべてのENOSYSを報告しています。

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

それはコンパイルすることは不可能であるsqueezeか、wheeze2.6.17の下で実行するGLIBC?

私が何を間違えたのか、そして/またはどのように進めるのかについてのアイデア/ポインタは大歓迎です...


クロスコンパイラのセットアップはそれほど難しくなく、このチュートリアルはWeb上にあります。Qemuでコンパイラを実行するよりも大幅に高速になります。結果のlibcが機能しなくなるのに役立つかどうかはわかりません。
ジル「SO-停止されて悪」

@Gilles:「チュートリアル」について-具体的なことを教えてください。crosstool-ngを試しましたが、ターゲットカーネルバージョン(2.6.17)までさかのぼりません。これは関連があると思います
-glibc

回答:


7

やった :-)

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

多数のテストと失敗した試行の後、上記の変更がそれを行いました-私はカーネルで動作するGLIBCのコンパイルされたバージョンを得て、結果のファイルを私の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:.

私はずっと行き、スクイーズを過ぎて移動しました:/ 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
...

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

最後に、私はlddldconfigバイナリ(GLIBCの一部でもあります)をコピーし、/ wheezy内でchrootしました。

動いた。

x86内のchrootされた「qemu-arm」エミュレーションからのGLIBCのコンパイルは、どういうわけか物事を台無しにしているとしか想定configureできません。 。

だから当然次のステップに移動し、busybox-staticシェルを使用して、古いlennyの{/ bin、/ sbin、...}フォルダーをwheezyフォルダーに置き換えました。そして、新しいWheezyを再起動しました:-)

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.