मेरे ARM SoC के लिए GLIBC का संकलन करें


13

मुझे चेरोट-एड डेबियन armelवातावरण के अंदर कुछ अजीब सा दिखाई दे रहा है।

लेकिन पहले, थोड़ा बैकस्टोरी ... यह लंबा है, लेकिन सवाल जटिल है और कोई भी संभावित मदद पूरी कहानी जानने पर निर्भर करती है।

मेरे पास एक एम्बेडेड ARM SoC है जो लिनक्स चलाता है - विशेष रूप से, armelएक 2.6.17 कर्नेल पर एक डेबियन लेनी। डेबियन डिस्ट्रो स्वयं बाद के संस्करणों के लिए आसानी से अपग्रेड करने योग्य है ( sudo apt-get dist-upgrade) और इस प्रकार इसे गति तक लाया जा सकता है, या इसके armelसंस्करणों squeezeतक भी लाया जा सकता है wheezy

समस्या यह है कि कर्नेल एक कस्टम है ... एआरएम SoC प्रश्न में मेनलाइन कर्नेल का हिस्सा नहीं है, इसलिए इसे 2.6.17 पर छोड़ दिया गया है।

यदि आप जानते हैं कि लिनक्स और GLIBC कैसे काम करते हैं, तो आप पहले से ही समस्या देख सकते हैं - GLIBC संस्करण न्यूनतम समर्थित कर्नेल संस्करण के साथ संकलित किए गए हैं ... जो पिछले 2.6.17 से आगे बढ़ चुके हैं। तो अगर हम एक 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) के साथ काम करने के लिए संकलित नहीं किया गया था।

मट्ठा के साथ भी यही समस्या है, क्योंकि - यह निचोड़ने की तुलना में नया है - और वास्तव में अब से किसी भी डेबियन संस्करण के साथ होगा, क्योंकि उनका GLIBC मेरे 2.6.17 कर्नेल पर काम नहीं करेगा।

पहले मुझे लगा कि यह एक डील ब्रेकर था - लेकिन तब मुझे एहसास हुआ कि मैं अपने पुराने कर्नेल के साथ काम करने के लिए GLIBC के सिद्धांत को फिर से तैयार कर सकता हूं, जिसका उपयोग मेरे SoC कर रहा है ... लेकिन मुझे libc6 के निर्माण के लिए एक समान वातावरण की आवश्यकता होगी उदाहरण के लिए डेबियन निचोड़ में पैकेज।

मैं GLIBC के संकलन का अनुमान लगा रहा हूं और libc6_2.11.3-4.deb फ़ाइल की तैयारी स्वचालित रूप से संकलित मशीनरी के माध्यम से की जाती है जो कि डेबियन के देवताओं द्वारा आविष्कार की गई है।

मैं कोई भगवान नहीं हूं ... और न ही मैं Google में कुछ भी पा सकता हूं कि कैसे एक बनें - यानी एक मेजबान के रूप में अपने कोर i5 का उपयोग कैसे करें, GLIBC को उसी सटीक सेटिंग्स का उपयोग करके संकलित करने के लिए, जो पैक किए गए संस्करण (डेबियन के अंदर squeeze) है का उपयोग करते हुए।

तो मैंने इसे धोखा दिया - मुझे पता चला कि मेरे कोर आई 5 (एक तकनीक जो qemu-armबाइनरी के स्थिर संस्करण का उपयोग करती है ) पर डेबियन निचोड़ के एआरएम संस्करण को कैसे सेटअप किया जाए ।

एक बार जब मैंने अपने 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 घंटे के बाद (कोर i5 द्वारा होस्ट किया गया कोरॉटेड संस्करण Debian-armel-squeezeदेशी मशीन की तुलना में बहुत धीमा है ...) मुझे मेरा libc6 .deb पैकेज मिला। मेरे SoC में इस निर्माण को करने में शायद 3 महीने का समय लगेगा, इसलिए मुझे कोई शिकायत नहीं है।

अपने वास्तविक एआरएम एसओसी के अंदर वापस जाकर, मैंने निचोड़ के डिफ़ॉल्ट लोगों पर नए पैकेज की सभी लिबास फ़ाइलों (.so) की नकल की और उसे काट देने की कोशिश की ...

# chroot squeeze/
root@ttsiodras:/# 

हाँ! इसने काम कर दिया! (या ऐसा लगता है)

मेरे कस्टम libc ने चुरोट के अंदर से रिपोर्ट किया:

# /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 में कुछ सिस्टम कॉल विफल हो रहे हैं।

क्या 2.6.17 के तहत निष्पादित करने के लिए squeezeया wheezeGLIBC को संकलित करना असंभव है ?

मैंने क्या गलत किया और / या कैसे आगे बढ़ना है, इस पर कोई विचार / संकेत ...


क्रॉस-कंपाइलर सेट करना उतना मुश्किल नहीं है और इसके लिए वेब पर ट्यूटोरियल हैं। यह Qemu में संकलक को चलाने की तुलना में काफी तेज होगा। मुझे नहीं पता कि यह काम कर रहे परिवाद के साथ मदद करेगा या नहीं।
गिल्स एसओ- बुराई को रोकना '

@ गिल्स: "ट्यूटोरियल्स" के बारे में - क्या आप कुछ विशेष की ओर इशारा कर सकते हैं? मैंने क्रोसस्टूल-एनजी की कोशिश की, लेकिन यह मेरे लक्ष्य कर्नेल संस्करण (2.6.17) के रूप में वापस नहीं जाता है। मुझे लगता है कि यह प्रासंगिक है - ग्लिब को मेरे कर्नेल से हेडर के साथ संकलित किया जाना चाहिए (शायद यही कारण है कि मेरी "एआरएम-आधारित" बिल्ड में मेरी समस्याएं पैदा हो रही हैं ...)
ttsiodras

जवाबों:


7

मैने कर दिखाया :-)

मैंने मूल रूप से गिल्स की सलाह का पालन किया और इसे ठीक से करने का निर्णय लिया: यानी GLIBC के पूर्ण क्रॉस-संकलन का प्रबंधन। मैंने क्रॉसस्टूल-एनजी से शुरू किया था, और शुरू में निराश था - यह देखकर कि यह मेरे पुराने कर्नेल का समर्थन नहीं करता था। मैंने इसे रखा, हालांकि - मैन्युअल रूप से क्रोसस्टूल-एनजी द्वारा सहेजे गए कॉन्फ़िगरेशन फ़ाइल को मैन्युअल रूप से इस तरह के परिवर्तनों को संपादित करने के लिए डिफ़ॉल्ट आर्म-ग्नूएबी बिल्ड कॉन्फ़िगरेशन पर:

$ 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 का एक संकलित संस्करण मिला जो मेरे कर्नेल के साथ काम करेगा, और परिणामी फाइलों को मेरे डेबियन लेनी एआरएम मशीन में कॉपी करेगा:

$ cd .build/arm-unknown-linux-gnueabi/build/build-libc-final/
$ tar zcpf newlibc.tgz $(find . -type f -iname \*.so)
$ scp newlibc.tgz root@mybook:.

मैं सभी तरह से चला गया और पिछले निचोड़ को स्थानांतरित कर दिया: मैंने / a / wheezy को डीबूटस्ट्रैप किया और फिर बहुत सावधानी से - /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 का भी हिस्सा थे) की नकल की, और मेरे / घरघराहट के अंदर काट दिया।

इसने काम कर दिया।

मैं केवल यह मान सकता हूं कि एक x86 के अंदर chroot-ed 'qemu-arm' एमुलेशन से GLIBC का संकलन, किसी तरह चीजों को गड़बड़ कर देता है - शायद यह configureप्रक्रिया चल रहे वातावरण से कुछ सामान का पता लगाती है - जबकि क्रॉस-कंपार्टमेंट को गुमराह नहीं किया जा सकता है ।

इसलिए स्वाभाविक रूप से मैं अगले कदम पर चला गया, और एक व्यस्त बॉक्स-स्थिर शेल का उपयोग करने के लिए {/ बिन, / sbin, ...} को अपने पुराने लेन के फ़ोल्डरों को मट्ठा के साथ बदल दिया - और मेरे ब्रांड नए व्हीजीई में रिबूट किया :-)

मैं इसके द्वारा दावा करता हूं कि मेरा WD MyBook वर्ल्ड एडिशन Debian Wheezy :-) चलाने वाले ग्रह पर केवल एक ही है। अगर किसी और को दिलचस्पी है, तो मैं किसी जगह पर libc फ़ाइलों के टारबॉल को अपलोड कर सकता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.