为我的ARM SoC交叉编译GLIBC

为我的ARM SoC交叉编译GLIBC,arm,glibc,Arm,Glibc,我在chroot-ed-Debian-armel环境中看到了一些非常奇怪的东西 但首先,一点背景故事。。。这很长,但问题是 这很复杂,任何潜在的帮助都取决于了解全部情况 我有一个运行Linux的嵌入式ARM SoC——更具体地说, 2.6.17内核上的Debian armel Lenny。Debian发行版本身就是 易于升级到更高版本sudo apt get dist升级 因此,可以提高速度,达到armel版本的 挤压甚至喘息 问题是内核是自定义的。。。ARM SoC 有问题的是,它不是主线内核

我在chroot-ed-Debian-armel环境中看到了一些非常奇怪的东西

但首先,一点背景故事。。。这很长,但问题是 这很复杂,任何潜在的帮助都取决于了解全部情况

我有一个运行Linux的嵌入式ARM SoC——更具体地说, 2.6.17内核上的Debian armel Lenny。Debian发行版本身就是 易于升级到更高版本sudo apt get dist升级 因此,可以提高速度,达到armel版本的 挤压甚至喘息

问题是内核是自定义的。。。ARM SoC 有问题的是,它不是主线内核的一部分,所以它很漂亮 在2.6.17被遗弃了很多

如果您知道Linux和GLIBC是如何工作的,那么您已经可以看到 问题-编译GLIBC版本时,至少需要支持 内核版本。。。已经超过了2.6.17。所以如果我们尝试 例如,chroot到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
…我们看到一个来自挤压的GLIBC的信息,告诉我们 它不是为使用这个旧内核2.6.17而编译的

同样的问题也发生在喘息上——因为喘息比喘息新 挤压-事实上,从现在起,任何Debian版本都会发生挤压, 因为他们的GLIBC无法在我的2.6.17内核上运行

起初我认为这是一个交易破坏者,但后来我意识到 理论上,我可以重新编译GLIBC来与更老的人一起工作 我的SoC正在使用的内核。。。但我需要一个相同的环境 使用什么来构建libc6包,例如Debian挤压

我在猜测GLIBC的汇编和 libc6_2.11.3-4.deb文件通过自动交叉编译完成 德比安神发明的机器

我不是上帝。。。我在谷歌也找不到任何关于如何做的信息 成为一体-即如何使用Core i5作为主机 交叉编译GLIBC,使用与打包的设置完全相同的设置 Debian Squence内部的版本正在使用

所以我骗了它-我想出了如何设置ARM版本 Debian对我的Core i5的压缩是一种使用静态 qemu arm二进制文件的版本

一旦我登录了我的x86托管版本Debian armel Squence, 我能够简单地

$ 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托管了chrooted版本的 Debian armel挤压比本地机器慢得多。。。 我拿到了我的libc6.deb包。可能需要3个月 在我的SoC中做这个构建,所以我没有抱怨

回到我真正的ARM SoC中,我复制了所有的libc文件 .因此,新软件包的性能优于默认软件包的性能 我试着去

# 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/>.
哦哦。。。一堆未实现的函数。听起来像是GLIBC的报道 基本的东西不起作用

我设法避开了“不问是怎么回事”的问题,并发现所有的at功能 失败:openat、mkdirat、renameat等等——他们都在报告ENOSYS

看来我只是部分成功-一些系统调用失败 在我的新GLIBC

是否不可能在2.6.17下编译一个挤压或喘息GLIBC来执行

任何关于我做错了什么和/或如何继续的想法/建议都将不胜感激

我做到了:-

我基本上遵循了UNIX stackexchange中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:.
我走了一路,越过了挤压:我用自己的手稿去写了armel debootstrapped/wheezy的GLIBC版本,然后——非常小心地——用自己的手稿重写了armel debootstrapped/wheezy的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的一部分,并在my/wheezy中创建

成功了

我只能假设,从chroot-ed-qemu-arm编译GLIBC会以某种方式把事情搞砸——也许配置过程会检测到运行环境中的一些东西——而交叉编译不会被误导

因此,我自然而然地进入了下一步,使用busybox静态shell将我的老lenny的{/bin,/sbin,…}文件夹替换为喘息文件夹,并重新启动到我的全新喘息文件夹中:-


我在此声明,这是地球上唯一一个运行Debian Wheezy的人:-如果其他人感兴趣,我可以将一个libc文件的tarball上传到某个地方。

您是如何让crosstool ng编译的?我已经尝试了我能做的一切,而且我一直在努力 正在使用无规则使目标“headers\u install”。停止在步骤“安装内核头”错误中生成失败。感谢您的帮助。
# # 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
...