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

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

chrooted Debian環境armelで非常に奇妙なものが見つかりました。

しかし、最初にいくつかの背景の話を聞きましょう...長いですが、問題は複雑で潜在的な助けは全体の話を知ることにかかっています。

私はLinuxを実行する組み込みARM SoCを持っています。具体的には、armel2.6.17カーネルを実行するDebian Lennyです。 Debianディストリビューション自体は、より高いバージョン(sudo apt-get dist-upgrade)に簡単にアップグレードできるため、アップグレードするarmelバージョンをsqueeze高速化できますwheezy

問題は、このコアがカスタムコアであるということです。

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...以前のカーネル(2.6.17)で使用するためにコンパイルされていないというGLIBCメッセージが表示されます。

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

最初はこれが取引を破ると思いました。しかし、後でそれができることに気づきました。理論的に私はSoCで使用されている古いカーネルと連携するようにGLIBCを再コンパイルしています。ただし、Debian squeeze で libc6 パッケージをビルドするために使用したのと同じ環境が必要です。

私は、GLIBCのコンパイルとlibc6_2.11.3-4.debファイルの準備が、Debianの神々が発明した自動クロスコンパイルマシンによって行われたと推測します。

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

qemu-armだから私はトリックを書いた。 Core i5でARMバージョンのDebian squeeze(静的バージョンバイナリを使用するテクノロジ)を設定する方法を見つけました。

x86 管理ビルドにルートを切り替えた後、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ホスティングchrootバージョンは 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ただし、fromを使用して一部のアプリをインストールしようとすると、次の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機能が失敗したことを発見しました:openat、、mkdiratなどrenameat- すべてENOSYSを報告しました。

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

2.6.17で実行するためにaまたはGLIBCをコンパイルすることは不可能ですかsqueezewheeze

私が何を間違っているのか、および/または進行方法についてのアイデア/ポインタがある場合は、大いに感謝します。

ベストアンサー1

私はそれをしました:-)

私は基本的に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をdebootstrapしてから - 非常に慎重に - /wheezyarmel-debootstrappedのGLIBCバージョンを私のバージョンで上書きしました。

# # 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にルートを指定しました。

効率的。

私はx86内でchrootされた 'qemu-arm'エミュレーションでGLIBCをコンパイルすることが何とか混乱したと仮定できます。おそらく、プロセスがconfigureランタイム環境で何かを検出した可能性があり、クロスコンパイルが間違っている可能性はありません。

だから自然に次のステップに進み、busybox-staticシェルを使って変える私の古いlennyの{/bin、/sbin、...}フォルダとwheezyフォルダ - そして新しいWheezyで再起動しました:-)

私はこれで宣言します私のWD MyBookワールドエディション私は地球上でDebian Wheezyを運営する唯一の人です。 :-) 他の人が興味があれば、どこかにlibcファイルのtarballをアップロードできます。

おすすめ記事