64 बिट फेडोरा 17 पर 32 बिट प्रोग्राम कैसे चलाएं?


10

हालाँकि Android विकास उपकरण (ADT) बंडल 'लिनक्स 64 बिट' के लिए ज़िप पैकेज के रूप में उपलब्ध है, यह आवश्यकताओं का पालन करता है :

64-बिट वितरण 32-बिट अनुप्रयोगों को चलाने में सक्षम होना चाहिए।

और वास्तव में, सिर्फ फेडोरा 17 64 बिट सिस्टम पर पैक किए गए ग्रहण को चलाने में त्रुटियां होती हैं, क्योंकि यह कई विकास उपकरण, जैसे ' adbया ' नहीं खोज सकता है aapt:

Aapt को निष्पादित करने में त्रुटि: प्रोग्राम नहीं चला सकता "/ home / juser / local / adt-bundle-linux / sdk / platform-tools / aapt": error = 2, ऐसी कोई फ़ाइल या निर्देशिका नहीं: error = 2, कोई फ़ाइल या निर्देशिका नहीं

'ऐसी कोई फ़ाइल' भ्रामक नहीं है क्योंकि यह वहां है ($ HOME / स्थानीय के तहत):

adt-bundle-linux/sdk/platform-tools/aapt

लेकिन मैं इसे शेल पर निष्पादित नहीं कर सकता:

~/local $ ./adt-bundle-linux/sdk/platform-tools/aapt 
zsh: no such file or directory: ./adt-bundle-linux/sdk/platform-tools/aapt

फाइल देख रहे हैं

$ file adt-bundle-linux/sdk/platform-tools/aapt
adt-bundle-linux/sdk/platform-tools/aapt: ELF 32-bit LSB executable, Intel 80386,
 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8,
 not stripped

हम देखते हैं कि यह एक 32 बाइनरी है। और ऐसा लगता है कि मेरा सिस्टम (वर्तमान में) 32-बिट अनुप्रयोगों को चलाने में सक्षम नहीं है।

मैं इसे कैसे बदल सकता हूँ? मैं वर्तमान Fedora 64 बिट सिस्टम को 32 बिट अनुप्रयोगों को चलाने में सक्षम कैसे बनाऊं?

(बेशक कोई यह भी पूछ सकता है कि किसी ने 32 बिट बायनेरिज़ को 'लिनक्स 64 बिट' नामक एक बाइनरी पैकेज में क्यों रखा है ...)


AskFedora पर उत्तर के साथ इसी तरह का प्रश्न: ask.fedoraproject.org/question/365/…
gertvdijk

जवाबों:


9

ग्रहण को खोजने में सक्षम नहीं होने के adbकारण, आदि, क्योंकि इस 32-बिट साझा पुस्तकालयों के बिना उन्हें सिस्टम पर चलाने की आवश्यकता होती है, वे निष्पादन योग्य नहीं हैं।

32-बिट पुस्तकालयों के संबंध में, स्थिति काफी सरल है: आपको बस उपयुक्त 32-बिट लिबास को स्थापित करने की आवश्यकता है। 64-बिट फ़ेडोरा 17 इंस्‍टॉल I के यहाँ, प्राथमिक 64-बिट लाइब्रेरी / usr / lib64 में हैं और वैकल्पिक 32-बिट libs / usr / lib में हैं। इसलिए, अगर मैं lddsdk / platform-tools / adb पर कॉल करता हूं :

linux-gate.so.1 =>  (0xf7791000)
librt.so.1 => /lib/librt.so.1 (0xf776c000)
libncurses.so.5 => /lib/libncurses.so.5 (0xf7747000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf772d000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0xf7644000)
libm.so.6 => /lib/libm.so.6 (0xf7618000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf75fb000)
libc.so.6 => /lib/libc.so.6 (0xf7449000)
/lib/ld-linux.so.2 (0xf7792000)
libdl.so.2 => /lib/libdl.so.2 (0xf7444000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0xf7424000)

ध्यान दें कि ये सभी / lib में हैं, जो / usr / lib (not / usr / lib64) के लिए एक सिमलिंक है। देखो:

»file /lib/libc.so.6
/lib/libc.so.6: symbolic link to `libc-2.15.so'
»file /lib/libc-2.15.so
/lib/libc-2.15.so: ELF 32-bit LSB shared object [...]

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

libc.so.6 => ??????

पहले , tho, काम करने के लिए ldd के लिए आपको 32-बिट लोडर की आवश्यकता होगी जो 32-बिट ग्लिबक के साथ आता है (इसके बिना, ldd इसे गैर-निष्पादन योग्य फ़ाइल कहेगा और आपको कुछ भी नहीं बताएगा):

»yum search glibc
glibc.i686 : The GNU libc libraries
glibc.x86_64 : The GNU libc libraries

वह छोटा है, लेकिन x86_64 पैकेज वह है जो आपके पास पहले से है; i686 32-बिट संस्करण है। तो बस स्थापित करें।

आपको किसी भी 'डीवेल' पैकेज की जरूरत नहीं है, क्योंकि कुछ भी संकलित नहीं है। उससे परे, शिक्षित अनुमान औरyum whatprovides / yum searchमदद करनी चाहिए (अदब के लिए सूची को देखते हुए, C ++ के 32-बिट संस्करण भी हैं, ncurses, pthreads, और I कुछ चीजें जो मुझे नहीं पता हैं)।

उपयोग करने के बारे में त्वरित टिप whatprovides :

»yum whatprovides libtinfo
No matches found.
»yum whatprovides libtinfo.so.5
[2 matches]
»yum whatprovides "*/libtinfo.so.5"
[4 matches]

;)


ठीक है, मैं पुस्तकालयों के i686 संस्करणों को स्थापित करने का प्रयास करूंगा ldd। इस कारण से: मैं आश्वस्त नहीं हूं, डिस्प्ले fileके बंडल संस्करण पर कॉल करना adb: ELF 32-बिट LSB निष्पादन योग्य, इंटेल 80386 - एआरएम अनुकरण के साथ कुछ भी नहीं करना है - और / usr / bin / adb (एंड्रॉइड-टूल फेडोरा पैकेज से) वास्तव में ELF 64-बिट LSB निष्पादन योग्य, x86-64 के रूप में उपलब्ध है ।
मैक्सक्लेपज़िग

अगर मैं इस पर ldd कहता हूं तो adt-bundle-linux/sdk/platform-tools/adbयह 'एक गतिशील निष्पादन योग्य नहीं' प्रदर्शित करता है। पथ के बारे में - यह समस्या नहीं है - ./adt-bundle-linux/sdk/platform-tools/adbएक टर्मिनल में उदाहरण के लिए पूरी तरह से निर्दिष्ट काम नहीं करता है ('zsh: ऐसी कोई फ़ाइल या निर्देशिका [..]' में परिणाम)।
मैक्सशेल्पीजिग

क्या आपके पास अभी तक glibc.i686 स्थापित है? जैसा कि मैंने कहा, आपको (संभावना) काम करने के लिए 32-बिट लोडर की आवश्यकता है, और यह ग्लिबक पैकेज के साथ होगा। WRT adb 32-बिट इंटेल आर्क होने के कारण, ऐसा इसलिए है क्योंकि आपका सिस्टम, ARM के लिए संकलित कुछ भी वहां काम नहीं करेगा। हालांकि, वही 32-बिट सामान एआरएम के लिए संकलित किया जा सकता है, और मुझे लगता है कि इसके कुछ हिस्से एंड्रॉइड डिवाइस पर उपयोग किए जाते हैं। मैं मानता हूँ कि आवश्यकता होने के बारे में गलत हो सकता है, लेकिन किसी भी मामले में, यह वही है जो उपलब्ध है, और यह वास्तव में परेशानी का ज्यादा हिस्सा नहीं है।
गोल्डीलॉक्स

पथ को गलत करें, शायद यह ग्रहण के लिए आवश्यक नहीं है, और (जैसा कि आप कहते हैं) आपको कमांड लाइन पर एक ही त्रुटि मिल सकती है यदि फ़ाइल को वैसे भी निष्पादित नहीं किया जा सकता है। बस स्थापित किए गए परिवादों आदि को प्राप्त करें, और आपको पता चल जाएगा।
गोल्डीलॉक्स

2
एमुलेटर का 32-बिट प्रोग्राम और एम्यूलेटेड प्लेटफॉर्म का 32-बिट प्रोसेसर होने के बीच कोई संबंध नहीं है। Android एमुलेटर वास्तव में Qemu पर आधारित है, जो होस्ट आर्किटेक्चर की परवाह किए बिना armv7 (32-बिट), armv8 (64-bit), x86, amd64, mips, mips64, और कई और अधिक का अनुकरण कर सकता है।
गिल्स एसओ- बुराई को रोकना '

8

आपको 32 बिट ग्लिब स्थापित करना होगा:

# yum install glibc.i686

यह 32 बिट बाइनरी निष्पादित करने का प्रयास करते समय भ्रामक 'ऐसी कोई फ़ाइल या निर्देशिका' संदेश नहीं निकालता है। इसके साथ 64 बिट फेडोरा प्रणाली 32 बिट बायनेरिज़ को निष्पादित करने में सक्षम है।

यह 32 बिट डायनेमिक निष्पादन योग्य पर lddकॉल करते समय भ्रामक 'एक गतिशील निष्पादन योग्य नहीं' संदेश को भी हटा देता है ldd

अब आपको गुम 32 बिट लाइब्रेरीज़ को इंस्टॉल करना होगा जिसके तहत बायनेरिज़ को adt-bundle-linux/sdk/platform-toolsइसके खिलाफ लिंक किया गया है:

# yum install zlib.i686 libstdc++.i686 ncurses-libs.i686 libgcc.i686

बस।

पृष्ठभूमि

कुछ पृष्ठभूमि उपरोक्त पैकेज नामों को कैसे प्राप्त करें। उदाहरण के लिए आउटपुट को देख रहा है

$ ldd adb
linux-gate.so.1 =>  (0xf774f000)
librt.so.1 => /lib/librt.so.1 (0xf7725000)
libncurses.so.5 => not found
libpthread.so.0 => /lib/libpthread.so.0 (0xf770b000)
libstdc++.so.6 => not found
libm.so.6 => /lib/libm.so.6 (0xf76df000)
    [..]

इसका मतलब है, कि 2 पुस्तकालय अभी भी अदब के लिए गायब हैं।

प्रत्येक 'नहीं मिला' के लिए हमें पैकेज का नाम देखना होगा, जैसे:

$ yum whatprovides '*libstdc++.so.6'
[..]
libstdc++-4.7.2-2.fc17.i686 : GNU Standard C++ Library
[..]

अब हम पैकेज बेस नाम लेते हैं और 32 बिट संस्करण प्राप्त करने के लिए इसमें '.i686' जोड़ते हैं।


यह उत्तर बहुत अच्छा है, विशेष रूप से पहला भाग - वास्तव में स्थापित करने से i386 बायनेरिज़ के साथ ठीक से काम करने की glibc.i686अनुमति मिलती lddहै।
क्रिस्टियन

2

आप के साथ आवश्यक पैकेज स्थापित कर सकते हैं:

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