ข้ามการรวบรวม GLIBC สำหรับ ARM SoC ของฉัน


13

ฉันเห็นบางสิ่งที่แปลกจริง ๆ ในarmelสภาพแวดล้อมDebian chroot-ed

แต่ก่อนอื่น backstory นิดหน่อย ... นี่มันนาน แต่คำถามมันซับซ้อนและความช่วยเหลือที่อาจเกิดขึ้นได้นั้นขึ้นอยู่กับการรู้เรื่องราวทั้งหมด

ฉันมี ARM SoC ในตัวที่รัน Linux - โดยเฉพาะ Debian armelLenny บนเคอร์เนล 2.6.17 Debian distro ตัวเองเป็นได้อย่างง่ายดายอัพเกรดเป็นรุ่นที่ใหม่กว่า ( sudo apt-get dist-upgrade) ดังนั้นจึงสามารถนำขึ้นไปความเร็วกับarmelรุ่น หรือแม้กระทั่งsqueezewheezy

ปัญหาคือเคอร์เนลเป็นแบบกำหนดเอง ... ARM SoC ที่เป็นปัญหาไม่ได้เป็นส่วนหนึ่งของเคอร์เนล mainline ดังนั้นมันจึงถูกละทิ้งที่ 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 ของsqueezeบอกเราว่ามันไม่ได้ถูกคอมไพล์ให้ทำงานกับเคอร์เนลเก่านี้ (2.6.17)

ปัญหาเดียวกันนี้เกิดขึ้นกับเสียงฮืด ๆ เหมือนกัน - เพราะมันใหม่กว่าบีบ - และในความเป็นจริงจะเกิดขึ้นกับ Debian เวอร์ชันใด ๆ นับจากนี้เป็นต้นไปเนื่องจาก GLIBC ของพวกเขาจะไม่ทำงานบนเคอร์เนล 2.6.17 ของฉัน

ตอนแรกฉันคิดว่านี่เป็นตัวจัดการข้อตกลง - แต่แล้วฉันก็รู้ว่าในทางทฤษฎีฉันสามารถรวบรวม GLIBC เพื่อทำงานกับเคอร์เนลรุ่นเก่าที่ SoC ของฉันใช้อยู่ ... แต่ฉันต้องการสภาพแวดล้อมที่เหมือนกันกับสิ่งที่เคยสร้าง libc6 แพคเกจในตัวอย่างเช่น Debian บีบ

ฉันคาดเดาการรวบรวม GLIBC และการจัดทำไฟล์ libc6_2.11.3-4.deb เสร็จแล้วผ่านเครื่องจักรรวบรวมข้ามอัตโนมัติที่คิดค้นโดย Gods of Debian

ผมไม่มีพระเจ้า ... ไม่ฉันสามารถหาอะไรใน Google เกี่ยวกับวิธีที่จะกลายเป็นหนึ่ง - คือวิธีการใช้รุ่น Core i5 ของฉันในฐานะเจ้าภาพเพื่อข้ามรวบรวม glibc ใช้การตั้งค่าเดียวกันแน่นอนว่ารุ่นแพคเกจ (ภายใน Debian squeeze) เป็น การใช้

ดังนั้นฉันจึงหลอก - ฉันคิดวิธีตั้งค่ารุ่น ARM ของ Debian บีบบน Core i5 ของฉัน (เทคนิคที่ใช้qemu-armไบนารีคงที่รุ่น)

เมื่อฉัน chrooted ในรุ่น 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 ชั่วโมง (รุ่น chrooted Core i5 โฮสต์ Debian-armel-squeezeเป็นช้ากว่าเครื่องพื้นเมือง ... ) ฉันได้รับแพคเกจ libc6 .deb ของฉัน อาจใช้เวลา 3 เดือนในการสร้างสิ่งนี้ใน SoC ของฉันดังนั้นฉันจึงไม่บ่น

ย้อนกลับไปด้านใน ARM SoC ตัวจริงของฉันฉันได้คัดลอกไฟล์ libc (.so) ทั้งหมดของแพคเกจใหม่ไปที่ไฟล์บีบอัดเริ่มต้นและพยายามบีบอัดไฟล์ ...

# 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ฟังก์ชั่นมีความล้มเหลว: openat, mkdirat, renameatฯลฯ - พวกเขาทั้งหมด ENOSYS รายงาน

ดูเหมือนว่าฉันจะประสบความสำเร็จเพียงบางส่วนเท่านั้น - การเรียกใช้ระบบบางอย่างล้มเหลวใน GLIBC ใหม่ของฉัน

เป็นไปไม่ได้ที่จะรวบรวม a squeezeหรือwheezeGLIBC เพื่อดำเนินการภายใต้ 2.6.17?

ความคิดใด ๆ / ตัวชี้ในสิ่งที่ฉันทำผิดและ / หรือวิธีการดำเนินการจะได้รับการชื่นชมมาก ...


การตั้งค่า cross-compiler นั้นไม่ใช่เรื่องยากและมีบทเรียนในเว็บสำหรับเรื่องนี้ มันจะเร็วกว่าการใช้คอมไพเลอร์ใน Qemu อย่างมีนัยสำคัญ ฉันไม่รู้ว่ามันจะช่วยให้ libc ที่เป็นผลลัพธ์ไม่ทำงานหรือไม่
Gilles 'หยุดความชั่วร้าย'

@Gilles: เกี่ยวกับ "บทเรียน" - คุณสามารถชี้ไปที่อะไรที่เฉพาะเจาะจงได้ไหม? ฉันลอง crosstool-ng แต่ไม่ไปไกลเท่ารุ่นเคอร์เนลเป้าหมายของฉัน (2.6.17) ฉันคิดว่าสิ่งนี้มีความเกี่ยวข้อง - glibc ต้องถูกคอมไพล์ด้วยส่วนหัวจากเคอร์เนลของฉัน (อาจเป็นสิ่งที่ทำให้เกิดปัญหาของฉันในการสร้าง "ARM-based" ของฉัน ... )
ttsiodras

คำตอบ:


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

ฉันไปทุกทางและเดินผ่านบีบ: ฉัน debootstrapped a / เสียงดังแล้ว - อย่างระมัดระวัง - เขียนทับรุ่น GLIBC ของ armel-debootstrapped /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) และ chrooted ใน / wheezy ของฉัน

มันได้ผล

ฉันสามารถสันนิษฐานได้ว่าการรวบรวม GLIBC จากการจำลอง chroot-ed 'qemu-arm' ภายใน x86 ทำให้เกิดความยุ่งเหยิงบางอย่าง - configureกระบวนการอาจตรวจพบบางสิ่งจากสภาพแวดล้อมการทำงาน - ในขณะที่การรวบรวมข้ามไม่สามารถเข้าใจผิด .

ดังนั้นโดยธรรมชาติฉันย้ายไปยังขั้นตอนต่อไปและใช้เชลล์ busybox แบบคงที่เพื่อแทนที่โฟลเดอร์ {/ bin, / sbin, ... } ของเงินเก่าของฉันด้วย wheezy - และทำการบูทใหม่เป็น Wheezy :-) ใหม่

ฉันขออ้างว่าWD MyBook World Edition ของฉันเป็นรุ่นเดียวในโลกที่ใช้ Debian Wheezy :-) หากใครสนใจฉันสามารถอัปโหลด tarball ของไฟล์ libc ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.