ldd मुझे बताता है कि मेरा ऐप "एक गतिशील निष्पादन योग्य नहीं है"


17

मेरे पास एक 32-बिट एप्लिकेशन (जिसे यूक्लसिन कहा जाता है) मुझे एक खगोल विज्ञान के प्रोफेसर से मिला है। मैं इसे एक साल पहले CentOS पर लाने में कामयाब रहा, लेकिन अब जब मैं एक नया CentOS VM स्थापित कर रहा हूं, तो यह नहीं चलेगा और मैं काम नहीं कर सकता। यह "किल्ड" के साथ वापस आता रहता है।

यह कमांड लाइन पर विनिमय है:

$ ./uclsyn_linux
Killed

$ ldd ./uclsyn_linux
not a dynamic executable

$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

मशीन पर जो चलता है, "ldd ./uclsyn_linux" निर्भरता की पूरी सूची देता है। मुझे ऐसे पैकेज मिले हैं जो इन साझा पुस्तकालयों को प्रदान करते हैं, और वे सभी स्थापित होने लगते हैं।

पैकेज की आवश्यकता

  • libSM-1.1.0-7.1.el6.i686
  • libX11-1.3-2.el6.i686
  • libgcc-4.4.6-3.el6.i386
  • glibc-2.12-1.47.el6_2.9.i686
  • libuuid-2.17.2-12.4.el6.i686
  • libXau-1.0.5-1.el6.i686
  • आवेदन करने के लिए स्थानीय पुस्तकालयों के ढेर भी हैं, जिन्हें मैंने जाँच लिया है और पहले से स्थापित हैं।

मेरा वातावरण

VirtualBox के तहत CentOS चल रहा है

uname -a: लिनक्स लोकलहोस्ट.लोकलोमेन 2.6.32-358.el6.i686 # 1 एसएमपी थू 21 फरवरी 12:50:49 यूटीसी 2013 i686 i686 i386 GNU / Linux


1
जंगली अनुमान: आप 32-बिट पुस्तकालयों के बिना 64-बिट ओएस पर 32-बिट बाइनरी चलाने की कोशिश कर रहे हैं।
michas

यह एक 32-बिट बाइनरी है, लेकिन मैंने जो ओएस स्थापित किया है वह CentOS का 32-बिट संस्करण है। कम से कम यही है कि अनाम-एक कमांड मुझे हां कहता है?
कार्ल

3
@ जिज्ञासा से बाहर, क्या strace ./uclsynउत्पादन करता है? जो हमें पहले संकेत दे रहा है कि क्या याद आ रही है।
05 बजे lgeorget

@lgeorget, यह लौटाता है: निष्पादित करें ("./ uclsyn_linux", ["//uclsyn_linux "], [/ * 56 vars * /] <अधूरा ...> +++ SIGKILL +++ से मारा गया
कार्ल

@ कार्ल ठीक है, इसलिए यह उस बिंदु पर भी नहीं जाता है जिस पर यह कुछ पुस्तकालयों को लोड करने की कोशिश करता है। मैंने straceप्रोग्राम से पहले कभी सही तरीके से लिंक नहीं होने की कोशिश की है ।
lgeorget

जवाबों:


13

मुझे सिर्फ 32-बिट बाइनरी के साथ समस्या थी, समाधान था:

apt-get install gcc-multilib

$ uname -a
Linux bla 2.6.32-028stab094.3 #1 SMP Thu Sep 22 12:47:37 MSD 2011 x86_64 GNU/Linux

3
आपको यह कैसे पता चला कि वह देयता गायब थी?
यौहदह

1
इस समाधान ने मेरे लिए काम किया। +1
फ्रैक्टलस्पेस

@yehudahs मैं काफी समय से लिनक्स पर पूर्वनिर्धारित 32 बिट अनुप्रयोगों को चला रहा हूं और साथ ही साथ उन्हें उल्टा इंजीनियरिंग कर रहा हूं, इसलिए मैंने शूटिंग के कुछ अनुभवों को इकट्ठा किया। : D
lama12345

1
अच्छा यह मेरे लिए काम करता था और साथ ही साथ मैं अपना सिर खुजलाता था कि मैं क्या गलत कर रहा हूँ
मारविन

1
मेरे लिए भी काम करता है: ldd को कुछ नहीं मिला जबकि यह काम करता है ^ ^
jy95

8

यहां त्रुटि VirtualMachine पर पर्याप्त रैम नहीं होने के कारण थी। रनिंग strace ./programnameने संकेत दिया कि किसी भी लाइब्रेरी को लोड करने से पहले, प्रोग्राम उसी तरह से मारा जा रहा है जैसे वह चलना शुरू करता है। उपलब्ध रैम की मात्रा में वृद्धि ने सुनिश्चित किया कि कार्यक्रम काम कर सकता है।

उपयोगी प्रतिक्रियाएँ

दूसरों से कुछ उपयोगी प्रतिक्रियाएँ मिलीं @slm जिन्होंने जाँचने के लिए उपयोगी आदेश दिए कि प्रत्येक पुस्तकालय में मौजूद थे, और @lgeorget जो straceकमांड का प्रयास करने का सुझाव दे रहे थे ।


5

क्या आप कुछ पुस्तकालयों को पोस्ट कर सकते हैं जो इसे (मूल प्रणाली से) लिंक करते हैं? आपको बस कुछ लापता लाइब्रेरी स्थापित करने की आवश्यकता हो सकती है।

आमतौर पर एक CentOS प्रणाली पर यह केवल एक yum कमांड चलाने की बात है जैसे:

yum install <package name>

आप मूल प्रणाली से पीछे की ओर काम कर सकते हैं जैसे:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff519ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003d6fe00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00000034fae00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00000034f7600000)

कि उत्पादन में आप देख सकते हैं, जहां के मेरे प्रति /bin/lsकहते हैं, उदाहरण के लिए .so साझा पुस्तकालयों उठा रहा है, librt.so.1है, जो यहाँ स्थित होना होता है: /lib64/librt.so.1

यह जानने के बाद, मूल प्रणाली पर, आप इस कमांड को यह पता लगाने के लिए चला सकते हैं कि यह लाइब्रेरी क्या पैकेज प्रदान करती है:

$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64

इसलिए पैकेज कहा जाता है glibc-2.13-2.x86_64। तो इसे स्थापित करने के लिए आप ऐसा करेंगे:

$ sudo yum install glibc-2.13-2.x86_64

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

क्या आपने yum install <package>अपने प्रश्न में उन पैकेजों को संदर्भित किया था?
स्लम

हाँ, मैंने किया। वे सभी libuuid.i686 को छोड़कर स्थापित किए गए थे जो अब है, लेकिन मुझे अभी भी वही समस्या है।
कार्ल

2

इसका उत्तर आपके प्रश्न में है: आप एक वर्ष पहले जीएनयू / लिनक्स के लिए एक एप्लिकेशन को चलाने का प्रयास करते हैं और आप इसे नए पुस्तकालयों के साथ चलाने का प्रयास करते हैं, जो अब संगत या उपलब्ध नहीं हो सकता है।

इस बिंदु पर, आपके पास दो विकल्प हैं। यदि आप इसे फिर से जोड़ सकते हैं (जो मुझे संदेह है, अगर मैं आपके मामले को अच्छी तरह से समझता हूं), तो यह चलेगा क्योंकि यह संगत पुस्तकालयों के साथ relinked होगा। अन्यथा, आप एक प्रकार का सैंडबॉक्स बनाने का प्रयास कर सकते हैं, उदाहरण के लिए जीएनयू पुस्तकालयों के पुराने संस्करण के साथ चलने वाला एक वीएम, जिसमें एप्लिकेशन को चलाने के लिए।


1
यह सही नहीं है। कार्यक्रम सांख्यिकीय रूप से जुड़ा हुआ है, मेजबान सिस्टम पर कोई लाइब्रेरी संदर्भित नहीं होने जा रही है। हालांकि ABI अभी भी असंगति का कारण बन सकता है, यह linux kernel (समान आर्किटेक्चर को मानते हुए) के छोटे रिव्यू के बीच की संभावना नहीं है।
ckhan

1
यह वैधानिक रूप से जुड़ा हुआ नहीं है, इससे आउटपुट देखें file। और जैसे संदेश No package xyz foundबताते हैं कि आवश्यक लाइब्रेरी अब उपलब्ध नहीं हैं (कम से कम, उसी तरह नहीं, जैसे एक ही पैकेज में)। इसलिए मेरा सुझाव है कि कार्यक्रम को फिर से बनाना, अगर यह संभव है, या इसे एक ऐसी प्रणाली में चलाना जिसमें यह काम करने के लिए जाना जाता था, पुराने पुस्तकालयों के साथ।
१२:०२

दुर्भाग्य से recompiling यहाँ एक विकल्प नहीं है। मैं इसे दूसरे सिस्टम पर उसी तरह से चला रहा हूं जिस तरह से मैं यहां कोशिश कर रहा हूं, लेकिन किसी कारण से, इस बार यह पसंद नहीं है।
कार्ल

ये गलत है। बदलते पते बिल्कुल भी मायने नहीं रखते। हटाए जा रहे कार्य या अन्य एबीआई ब्रेक लाइब्रेरी के प्रमुख संशोधनों पर होते हैं (जो कि दुर्लभ हैं), जिस स्थिति में, आपको libfoo2 लोड करने में त्रुटि मिलेगी, यदि आपके पास libfoo2 स्थापित नहीं है, तो आपके पास libfoo3 स्थापित है या नहीं।
Psusi

ठीक है, जानकर अच्छा लगा। मैंने सोचा था कि एक पुस्तकालय में कोई भी बदलाव लिंकिंग को तोड़ सकता है। मैं वर्तमान में एक जेंटू चला रहा हूं और मुझे अक्सर लाइब्रेरी को अपग्रेड करते समय रिवर्स निर्भरता को फिर से भरना पड़ता है, इसलिए मुझे नहीं लगा कि लिंकिंग लाइब्रेरी परिवर्तनों के लिए प्रतिरोधी थी।
at:

0

readelf -l uclsyn_linux अनुरोध करने का प्रयास करें कार्यक्रम दुभाषिया आपको बताएगा कि आप क्या याद कर रहे हैं।


1
मैं readelf -l <file>एक ही lddव्यवहार ( not a dynamic executable) के साथ एक फ़ाइल के खिलाफ भाग गया , लेकिन मुझे तुरंत एक लापता पुस्तकालय का संकेत देने के लिए कुछ भी दिखाई नहीं दे रहा है। मैं देख रहा हूँ Elf file type is EXEC (Executable file), Entry point, Program Headersऔर Section to Segment mapping। वास्तव में मुझे आउटपुट में क्या देखना चाहिए?
स्टॉकबी

0

में आर्क लिनक्स , अगर फ़ाइल 32-बिट योगिनी है, तो आप स्थापित कर सकते हैं lib32-जीसीसी-libs (multilib रिपोजिटरी से) समस्या को हल करने के लिए।

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