एक निष्पादन योग्य पर "ऐसी कोई फ़ाइल या निर्देशिका" नहीं है, फिर भी फ़ाइल मौजूद है और मौजूद सभी पुस्तकालयों को रिपोर्ट करती है


13

इसलिए किसी भी अन्य कमांड द्वारा निष्पादन योग्य फ़ाइल मौजूद है, फिर भी जब मैं इसे निष्पादित करने का प्रयास करता हूं, तो यह दावा करता है कि यह वहां नहीं है।

यह नाम में एक विशेष चरित्र नहीं है क्योंकि मैंने इसे "बिल्ली" नाम दिया था। और यह सही वास्तुकला के लिए एक द्विआधारी लगता है ... "लगता है", मुझे लगता है कि सवाल यह है कि और क्या त्रुटि संदेश BESIDES फेंकता है ... फ़ाइल वहाँ नहीं है, क्योंकि यह स्पष्ट रूप से है!

ldd xls

    linux-gate.so.1 =>  (0xb77bc000)
    libQtGui.so.4 => /usr/lib/i386-linux-gnu/libQtGui.so.4 (0xb6cc2000)
    libpng12.so.0 => /lib/i386-linux-gnu/libpng12.so.0 (0xb6c98000)
    libSM.so.6 => /usr/lib/i386-linux-gnu/libSM.so.6 (0xb6c8f000)
    libICE.so.6 => /usr/lib/i386-linux-gnu/libICE.so.6 (0xb6c76000)
    libXrender.so.1 => /usr/lib/i386-linux-gnu/libXrender.so.1 (0xb6c6d000)
    libfreetype.so.6 => /usr/lib/i386-linux-gnu/libfreetype.so.6 (0xb6bd1000)
    libfontconfig.so.1 => /usr/lib/i386-linux-gnu/libfontconfig.so.1 (0xb6b9b000)
    libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb6b88000)
    libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb6a50000)
    libm.so.6 => /lib/i386-linux-gnu/i686/cmov/libm.so.6 (0xb6a2a000)
    libQtSql.so.4 => /usr/lib/i386-linux-gnu/libQtSql.so.4 (0xb69ea000)
    libQtCore.so.4 => /usr/lib/i386-linux-gnu/libQtCore.so.4 (0xb6704000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb66ea000)
    libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0xb66e7000)
    libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb65ea000)
    libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb6598000)
    librt.so.1 => /lib/i386-linux-gnu/i686/cmov/librt.so.1 (0xb658f000)
    libpthread.so.0 => /lib/i386-linux-gnu/i686/cmov/libpthread.so.0 (0xb6575000)
    libdl.so.2 => /lib/i386-linux-gnu/i686/cmov/libdl.so.2 (0xb6571000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6485000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6468000)
    libc.so.6 => /lib/i386-linux-gnu/i686/cmov/libc.so.6 (0xb6305000)
    libaudio.so.2 => /usr/lib/i386-linux-gnu/libaudio.so.2 (0xb62ea000)
    libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xb62e4000)
    libexpat.so.1 => /lib/i386-linux-gnu/libexpat.so.1 (0xb62ba000)
    libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6297000)
    /lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)
    libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb6258000)
    libffi.so.5 => /usr/lib/i386-linux-gnu/libffi.so.5 (0xb624f000)
    libXt.so.6 => /usr/lib/i386-linux-gnu/libXt.so.6 (0xb61f1000)
    libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb61ee000)
    libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb61e8000)

uname -m (इसके अलावा, मेरा वितरण डेबियन व्हीज़ी है।)

i686

फ़ाइल xls

xls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
     dynamically linked (uses shared libs), for GNU/Linux 2.6.15,
     BuildID[sha1]=0xa9786f61b371a683ae4306792f95e0636c288883, not stripped

एलएस-बड़े एक्सएल

-rwxr-xr-x 1 root root 4634064 May 20 14:35 xls

बिल्ली

root@pc170:# cat xls > zls
root@pc170:# ./zls
-su: ./zls: Permission denied
root@pc170:# chmod +x zls
root@pc170:# ./zls
-su: ./zls: No such file or directory

समय

root@pc170:# time ./zls
-su: ./zls: No such file or directory

real    0m0.002s
user    0m0.000s
sys     0m0.000s

1
किस बारे में LD_DEBUG=all /lib/ld-lsb.so.3 ./zls?
स्टीफन चेज़लस

1
इसके बारे में एक बात: यह कहता है "su: "कि ऐसा लगता है कि आप system()प्रोग्राम के अंदर से किसी चीज को अंजाम दे रहे हैं और यह कह रहे हैं कि ऐसा करने के बाद यह suउस डायरेक्टरी में एक्जीक्यूटेबल का पता नहीं लगा सकता है जो आपके अंदर होती है। इसे कॉपी करें या इसे /binकिसी चीज़ से जोड़ दें ?
ब्राचली

आइए कोशिश करते हैं objdump -j .interp -s ./zls। मुझे संदेह है कि उस फ़ाइल को सूचीबद्ध करेगा जो मौजूद नहीं है।
derobert

जवाबों:


20

यह एक लापता लोडर की तरह दिखता है । लघु कहानी: प्रोग्राम द्वारा अपेक्षित डायनेमिक लोडर गायब है, और इस मामले में त्रुटि संदेश भ्रामक हैं। चूंकि मुझे नहीं लगता कि मैंने उस पर चर्चा की है, इसलिए मुझे आउटपुट के प्रासंगिक भाग के बारे में बताएं ldd। इसमें से अधिकांश फॉर्म की पंक्तियों के अनुरूप हैं library_soname => /path/to/library_file

/lib/ld-lsb.so.3 => /lib/ld-linux.so.2 (0xb77bd000)

पुस्तकालयों के बीच, हम कुछ ऐसा देखते हैं जो साझा पुस्तकालय नहीं है: यह वह कार्यक्रम है जो साझा पुस्तकालयों को लोड करता है। कार्यक्रम अनुरोध कर रहा है /lib/ld-lsb.so.3, लेकिन कर्नेल इसे नहीं ढूंढता है, इसलिए यह "ऐसी कोई फ़ाइल या निर्देशिका नहीं" रिपोर्ट करता है। फिर भी lddलोडर को ढूंढता है, क्योंकि lddएक आवरण स्क्रिप्ट है जो एक विशेष वातावरण में एक हार्ड-कोडित लोडर को कॉल करता है, और लोडर हमेशा अपने स्वयं के पथ की रिपोर्ट करता है, चाहे लोडर पथ ने कार्यक्रम की अपेक्षा की हो।

आपके पास /lib/ld-linux.so.2आपके सिस्टम पर है, जो x86_32 लिनक्स सिस्टम पर ELF लोडर के लिए वास्तविक मानक स्थान है। कार्यक्रम की आवश्यकता है /lib/ld-lsb.so.3, जो डी ज्यूर मानक स्थान है।

अपने वितरण का न्यूनतम एलएसबी समर्थन स्थापित करें, उदाहरण के लिए lsb-coreडेबियन पर पैकेज। यदि आपके वितरण में ऐसा नहीं है (सबसे अधिक), तो एक प्रतीकात्मक लिंक बनाएं /lib/ld-lsb.so.3 -> ld-linux.so.2। हताशा में आप लोडर को स्पष्ट रूप से कॉल कर सकते हैं /lib/ld-linux.so.2 ./xls:।


दरअसल, लोडर वह है जो कि objdump लाइन का प्रिंट आउट होता है। मैं भूल गया कि यह वास्तव में lddआउटपुट में था । अच्छी पकड़!
derobert

यह वास्तव में मेरे द्वारा देखी गई समस्या है, भ्रामक त्रुटि संदेश के साथ। एक समस्या यह है कि अगर डायनेमिक लोडर मौजूद नहीं है तो यह 'ldd' नहीं चलेगा क्योंकि यह एक शेल स्क्रिप्ट पर (कम से कम सेंटो पर) है।
dajobe

64-बिट सिस्टम पर 32-बिट लिबास के गुम होने की बात करने वाले पोस्टों के समुद्र के बीच इस सबसे सहायक पोस्ट के लिए धन्यवाद।
माइकल बूर

readelf -a zls | grep "Requesting program interpreter"लोडर प्रिंट करेगा।
केविन स्माइथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.