operating - execve फ़ाइल नहीं मिला जब बहुत ही फाइल stracing!




unix operating system in hindi (4)

जिस फ़ाइल को आप निष्पादित करने की कोशिश कर रहे हैं ( …/lmutil ) मौजूद है लेकिन इसका "लोडर" मौजूद नहीं है, जहां

  • मूल निष्पादन योग्य का लोडर इसके गतिशील लोडर है, उदाहरण के लिए /lib/ld-linux.so.2 ;
  • एक स्क्रिप्ट का लोडर एक कार्यक्रम है जिसका शेबांग लाइन में उल्लेख किया गया है, जैसे, /bin/sh अगर स्क्रिप्ट #!/bin/sh शुरू होती है

निर्देशिका के नाम से, एक अच्छा मौका है कि lmutil एक amd64 linux बाइनरी है, /lib64/ld-linux-x86-64.so.2 को इसके लोडर की तलाश में है, लेकिन आपके पास एक amd64 लिनक्स कर्नेल है जिसमें 386 यानी 32-बिट) यूज़रलैंड आपको अपने मंच के लिए उपयुक्त बायनेरिज़ प्राप्त करने की आवश्यकता है।

मैं इस स्थिति को यूनिक्स की सबसे भ्रामक त्रुटि संदेश मानता हूं। दुर्भाग्य से यह तय करना कठिन होगा: कर्नेल केवल एक संख्यात्मक त्रुटि कोड को प्रोग्राम के कॉलर को रिपोर्ट कर सकता है, इसलिए इसमें केवल "कमांड नहीं मिला" ( ENOENT ) के लिए ENOENT और वह लोडर के नाम के लिए नहीं, जिसकी तलाश है। यह दुर्लभ मामलों में से एक है जहां strace मदद नहीं करता है।

मुझे पता है कि कोई समस्या ' lmutil ' चलते समय एक समस्या का सामना कर रही lmutil , इसलिए मैंने उनसे strace -f lmutil को कहा। क्यों नहीं execve "ऐसी कोई फ़ाइल" के साथ विफल रहा है !!! यह कोई मतलब नहीं है, क्योंकि मैं बहुत ही फाइल को धीमा कर रहा हूं !! यहाँ वास्तव में क्या हो रहा है???

strace -f /home/tabitha/Starprogram/FLEXlm_11.7/linux-x86_64-2.3.4/bin/lmutil

आउटपुट:

execve("/home/tabitha/Starprogram/FLEXlm_11.7/linux-x86_64-2.3.4/bin/lmutil", ["/home/tabitha/Starprogram/FLEXlm"...], [/* 38 vars */]) = -1 ENOENT (No such file or directory)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd7cb8b0000
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
write(3, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
close(3)                                = 0
munmap(0x7fd7cb8b0000, 4096)            = 0
exit_group(1)                           = ?

एलडीडी आउटपुट

$ ldd ./lmutil
        linux-vdso.so.1 =>  (0x00007fffcd5ff000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fe40ebbe000)
        libm.so.6 => /lib/libm.so.6 (0x00007fe40e93b000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fe40e724000)
        libc.so.6 => /lib/libc.so.6 (0x00007fe40e3a1000)
        libdl.so.2 => /lib/libdl.so.2 (0x00007fe40e19d000)
        /lib64/ld-lsb-x86-64.so.3 => /lib64/ld-linux-x86-64.so.2 (0x00007fe40edf5000)
$ find . -name lmutil -exec file {} \;
./bin.linux.x86_64/lmutil: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.4.0, dynamically linked (uses shared libs), for GNU/Linux 2.4.0, stripped
./bin.linux.x86/lmutil: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), for GNU/Linux 2.2.5, stripped
./lmutil: Bourne shell script text executable

बस अटकलें का थोड़ा सा, लेकिन मेरा पहला सवाल यह होगा कि उपयोगकर्ता जो इस समस्या को चल रहा है, बिना किसी स्ट्रैस के निष्पादन योग्य चला सकते हैं।

इसके अलावा निष्पादन मैनुअल पेज का कहना है कि अगर फ़ाइल या आवश्यक स्क्रिप्ट इंटररेप्रेटर या साझा लाइब्रेरी नहीं मिल पाती है तो ENOENT घटित होगा। (मुझे पता है कि इसमें 64-बिट-निस शामिल हैं। क्या सभी अधिकार पुस्तकालय उपलब्ध हैं?)

क्या फ़ाइल को एक मूल निष्पादन योग्य है या क्या यह किसी प्रकार की एक स्क्रिप्ट हो सकती है?

यह एक लाइसेंसिंग प्रबंधक की तरह लग रहा है - कोई मौका यह खुद को जानबूझकर डीबग करना कठिन बना दिया है?

उपयोगकर्ताओं की बात, 'टैबिथा' किसकी डायरेक्टरी में चलने योग्य उपयोगकर्ता समस्या वाले उपयोगकर्ता रहता है? या हम रूट द्वारा सामान्य प्रणाली-व्यापी फैशन की बजाय किसी अन्य सामान्य उपयोगकर्ता द्वारा इंस्टॉल किए गए प्रोग्राम को चलाने की कोशिश करने की एक संभावित जटिलता को देख रहे हैं?


आपका एलडीडी आउटपुट / lib64/ld-lsb-x86-64.so.3 को संदर्भित करता है, लेकिन यह लोडर वास्तव में मौजूद नहीं हो सकता है (जब तक कि आप उबंटू पर) आपने एलएसबी-कोर पैकेज स्थापित नहीं किया है पैकेज के लिए postinst स्क्रिप्ट / lib * निर्देशिकाओं में संबंधित प्रतीकात्मक लिंक बनाता है।


गतिशील रूप से भरी हुई या निष्पादन योग्य द्वारा लोडर की अपेक्षा की जाने वाली जांच करने के लिए आप किसी भी तरह से readelf (किसी भी रीडबल को करना चाहिए, आपको किसी विशेष क्रॉसकंपलर टूलचैन से नहीं चाहिए) का उपयोग कर सकते हैं।

$ readelf -l <filename> |grep -i interp
...
[Requesting program interpreter: /system/bin/linker]