2009-10-13 8 views
8

मैं LSB SDK का उपयोग करने के लिए एक परीक्षण ELF कार्यक्रम का निर्माण किया है (ध्यान दें कि मेरे सवाल के लिए विशिष्ट नहीं है LSB):मुझे कैसे पता चलेगा कि कौन सी ईएलएफ निर्भरता पूरी नहीं हुई है?

$ /opt/lsb/bin/lsbcc tst.c 
$ ls -l a.out 
-rwxr-xr-x 1 math math 10791 2009-10-13 20:13 a.out 
$ file a.out 
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped 

लेकिन मैं इसे शुरू करने के लिए असमर्थ हूँ (हाँ, मैं आपको विश्वास दिलाता हूं फ़ाइल निर्देशिका में ...) है:

$ ./a.out 
bash: ./a.out: No such file or directory 

$ uname -a 
Linux math 2.6.28-15-generiC#52-Ubuntu SMP Wed Sep 9 10:48:52 UTC 2009 x86_64 GNU/Linux 

मुझे लगता है कि एक ELF निर्भरता जो पूरा नहीं कर रहा है वहाँ है, लेकिन मैं उसे ढूंढने का तरीका पता नहीं है। क्या पुस्तकालयों के लिए एक समान उपकरण है जो लापता लिंक को खोजने के लिए उपयोग किया जा सकता है?

मैं क्योंकि LSB संकलक काम कर रहा है नहीं लगता कि यह 2.6.15/2.6.28-15 अंतर से संबंधित है:

$ file /opt/lsb/bin/lsbcc 
/opt/lsb/bin/lsbcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped 

शायद ज़रुरत पड़े, यहाँ एक की ELF गतिशील अनुभाग है .out:

0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x000000000000000c (INIT)    0x400428 
0x000000000000000d (FINI)    0x400638 
0x0000000000000004 (HASH)    0x400278 
0x0000000000000005 (STRTAB)    0x400350 
0x0000000000000006 (SYMTAB)    0x4002a8 
0x000000000000000a (STRSZ)    121 (bytes) 
0x000000000000000b (SYMENT)    24 (bytes) 
0x0000000000000015 (DEBUG)    0x0 
0x0000000000000003 (PLTGOT)    0x600fe8 
0x0000000000000002 (PLTRELSZ)   24 (bytes) 
0x0000000000000014 (PLTREL)    RELA 
0x0000000000000017 (JMPREL)    0x400410 
0x0000000000000007 (RELA)    0x4003f8 
0x0000000000000008 (RELASZ)    24 (bytes) 
0x0000000000000009 (RELAENT)   24 (bytes) 
0x000000006ffffffe (VERNEED)   0x4003d8 
0x000000006fffffff (VERNEEDNUM)   1 
0x000000006ffffff0 (VERSYM)    0x4003ca 
0x0000000000000000 (NULL)    0x0 

उत्तर

11

ऐसा लगता है कि ईएलएफ दुभाषिया गायब होने पर क्या होता है।

सुनिश्चित करें कि /lib/ld-lsb.so.2 (या समान; एलएसबी संस्करण और वास्तुकला द्वारा भिन्न होता है) मौजूद है। ldd और readelf -l आपके निष्पादन योग्य अनुरोध करने वाले ईएलएफ दुभाषिया को दिखाने में सक्षम होंगे।

(lsbcc (या LSB toolchain में कुछ), सिस्टम डिफ़ॉल्ट /lib/ld-linux.so.2 ओवरराइड करता है शायद संकलक को -Wl,--dynamic-linker=/lib/ld-lsb.so.2 गुजर, कारणों मुझे लगता है कि नहीं बल्कि मूर्खतापूर्ण हैं (Glibc हमेशा काफी उत्कृष्ट पीछे संगतता यहां प्रदान की गई है के लिए द्वारा), लेकिन वहाँ आपके पास यह है।)

+0

यही है, मेरे पास सिस्टम पर एलएसबी दुभाषिया (/lib64/ld-lsb-x86-64.so.3) नहीं है। वास्तव में, मुझे नहीं पता था कि एक एलएसबी-विशिष्ट दुभाषिया है जिसे मुझे स्थापित करने की आवश्यकता है ... यह मजाकिया है कि एलएसबी एसडीके में द्विआधारी एलएसबी अनुपालन नहीं हैं। – math

संबंधित मुद्दे