ARM SoC용 GLIBC 크로스 컴파일

ARM SoC용 GLIBC 크로스 컴파일

chrooted Debian 환경 armel에서 매우 이상한 것을 발견 했습니다.

하지만 먼저 몇 가지 배경 이야기를 들어보겠습니다... 길지만 문제는 복잡하고 잠재적인 도움은 전체 이야기를 아는 데 달려 있습니다.

저는 Linux를 실행하는 임베디드 ARM SoC를 가지고 있습니다. 더 구체적으로 말하면 armel2.6.17 커널을 실행하는 Debian Lenny입니다. 데비안 배포판 자체는 더 높은 버전( sudo apt-get dist-upgrade) 으로 쉽게 업그레이드할 수 있으므로 업그레이드하는 armel버전의 속도를 squeeze높일 수 있습니다 wheezy.

문제는 이 코어가 커스텀 코어라는 점인데... 문제의 ARM SoC는 메인라인 코어의 일부가 아니어서 2.6.17에서 거의 버려졌습니다.

Linux와 GLIBC의 작동 방식을 알고 있다면 이미 문제를 볼 수 있습니다. GLIBC 버전은 지원되는 가장 낮은 커널 버전(2.6.17 이상)으로 컴파일됩니다. 따라서 데비안 시스템으로 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보다 최신 버전이기 때문입니다. 실제로 지금부터 모든 데비안 버전에서 발생합니다. GLIBC가 내 2.6.17 커널에서 작동하지 않기 때문입니다.

처음에는 이것이 거래를 깨뜨릴 것이라고 생각했습니다. 그러나 나중에는 그럴 수 있다는 것을 깨달았습니다.이론적으로내 SoC에서 사용하는 이전 커널과 작동하도록 GLIBC를 다시 컴파일하는 중입니다. 하지만 Debian squeeze에서 libc6 패키지를 빌드하는 데 사용된 환경과 동일한 환경이 필요합니다.

나는 GLIBC의 컴파일과 libc6_2.11.3-4.deb 파일의 준비가 데비안 신들이 발명한 자동 크로스 컴파일 기계에 의해 수행되었다고 추측합니다.

나는 신이 아닙니다... 또한 신이 되는 방법에 대한 정보를 Google에서 찾을 수 없습니다. 즉, squeeze패키지 버전과 정확히 동일한 설정을 사용하여 내 Core i5를 호스트로 사용하여 GLIBC를 크로스 컴파일하는 방법( 데비안 내에서).

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를 컴파일하는 것이 불가능합니까 squeeze?wheeze

내가 뭘 잘못하고 있는지 및/또는 진행 방법에 대한 아이디어/포인터가 있으면 크게 감사하겠습니다...

답변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을 업로드할 수 있습니다.

관련 정보