2012-04-20 11 views
7

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

मैं कई अन्य वितरण की कोशिश की है में libreadline "निर्भरता" पाया करने के लिए देखते हैं, लेकिन मैं Tikanga

से
$ lsb_release -a 
LSB Version: :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-ia32:printing-4.0-noarch 
Distributor ID: RedHatEnterpriseServer 
Description: Red Hat Enterprise Linux Server release 5.6 (Tikanga) 
Release:  5.6 
Codename:  Tikanga 
को कॉपी कर रहा हूँ

देखें ldd डिफ़ॉल्ट स्थापित python (आधिकारिक भंडारों से) पर करता है।

$ which python 
/usr/bin/python 
$ ldd `which python` 
    libpython2.4.so.1.0 => /usr/lib64/libpython2.4.so.1.0 (0x00000030e6200000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030e0e00000) 
    libdl.so.2 => /lib64/libdl.so.2 (0x00000030e0a00000) 
    libutil.so.1 => /lib64/libutil.so.1 (0x00000030ee800000) 
    libm.so.6 => /lib64/libm.so.6 (0x00000030e0600000) 
    libc.so.6 => /lib64/libc.so.6 (0x00000030e0200000) 
    /lib64/ld-linux-x86-64.so.2 (0x00000030dfe00000) 
$ ldd `which python` | grep readline 
$ 

रीडलाइन के बारे में कुछ भी नहीं मिला। अब मुझे इंटरैक्टिव उपयोग से पता है कि इस बाइनरी में वास्तविक कार्यक्षमता है, इसलिए यह देखने की कोशिश न करें कि यह कहां से आ रहा है।

$ python & 
[1] 21003 
$ Python 2.4.3 (#1, Dec 10 2010, 17:24:35) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-50)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 

[1]+ Stopped     python 

पृष्ठभूमि (पीआईडी ​​21003)

$ lsof -p 21003 
COMMAND PID USER FD TYPE DEVICE  SIZE NODE NAME 
python 21003 ddvento cwd DIR 0,33 16384 164304 /glade/home/ddvento/loader-test 
python 21003 ddvento rtd DIR 8,3  4096  2/
python 21003 ddvento txt REG 8,3  8304 6813419 /usr/bin/python 
python 21003 ddvento mem REG 8,3 143600 8699326 /lib64/ld-2.5.so 
python 21003 ddvento mem REG 8,3 1722304 8699327 /lib64/libc-2.5.so 
python 21003 ddvento mem REG 8,3 615136 8699490 /lib64/libm-2.5.so 
python 21003 ddvento mem REG 8,3 23360 8699458 /lib64/libdl-2.5.so 
python 21003 ddvento mem REG 8,3 145824 8699445 /lib64/libpthread-2.5.so 
python 21003 ddvento mem REG 8,3 247544 6821551 /usr/lib64/libreadline.so.5.1 
python 21003 ddvento mem REG 8,3 15840 8699446 /lib64/libtermcap.so.2.0.8 
python 21003 ddvento mem REG 8,3 1244792 6833317 /usr/lib64/libpython2.4.so.1.0 
python 21003 ddvento mem REG 8,3 18152 8699626 /lib64/libutil-2.5.so 
python 21003 ddvento mem REG 8,3 56446448 6832889 /usr/lib/locale/locale-archive 
python 21003 ddvento mem REG 8,3 21808 6965997 /usr/lib64/python2.4/lib-dynload/readline.so 
python 21003 ddvento mem REG 8,3 25464 6901074 /usr/lib64/gconv/gconv-modules.cache 
python 21003 ddvento 0u CHR 136,1    3 /dev/pts/1 
python 21003 ddvento 1u CHR 136,1    3 /dev/pts/1 
python 21003 ddvento 2u CHR 136,1    3 /dev/pts/1 
$ lsof -p 21003 | grep readline 
python 21003 ddvento mem REG 8,3 247544 6821551 /usr/lib64/libreadline.so.5.1 
python 21003 ddvento mem REG 8,3 21808 6965997 /usr/lib64/python2.4/lib-dynload/readline.so 

बिंगो में एक इंटरैक्टिव अजगर सत्र शुरू किया! यहां यह पठार है!

हालांकि, इस तकनीक काम करता है केवल जब पुस्तकालय को प्रभावी ढंग से भरी हुई है तो उदाहरण के लिए, जब तक अजगर प्रक्रिया मैं दो प्रश्न पूछना चाहते हैं की तरह from Tkinter import *

तो कुछ नहीं चलता है यह /usr/lib64/libtcl8.4.so नहीं मिल रहा है:

  1. मुझे विश्वास है कि ldd के साथ समस्या यह है कि यह मानक लोडर के उपयोग को मानता है, जबकि बहुत अधिक संभावना है कि पाइथन अपने विशेष लोडर का उपयोग कर रहा है (ताकि जब भी आप एक नया पायथन मॉड्यूल स्थापित करते हैं तो निष्पादन योग्य को फिर से कनेक्ट करने की आवश्यकता नहीं है शुद्ध पायथन नहीं है लेकिन कुछ सी/सी ++/फोर्टन है कोड)। क्या ये सही है?

  2. स्पष्ट रूप से, यदि कोई निष्पादन योग्य अपने लोडर का उपयोग कर रहा है, तो इस निष्पादन योग्य लोड होने वाले सभी संभावित पुस्तकालयों को कैसे ढूंढें "प्रश्न का कोई स्पष्ट जवाब नहीं है: यह लोडर के काम पर निर्भर करता है। लेकिन क्या पाइथन द्वारा पुस्तकालयों को लोड किया जा सकता है यह जानने का कोई तरीका है?

पुनश्च: 1. से संबंधित आप इस प्रश्न पर उतरने रहे हैं, तो आप पहले से ही निम्नलिखित पता होना चाहिए, लेकिन अगर नहीं है तो आप चाहिए: देखते हैं कि कैसे सरल करने के लिए पूरी तरह से गंदगी ldd उत्पादन होता है (यह खिलवाड़ अप केवल आंशिक रूप से एक छोटे से कठिन है):

$ cat hello.c 
#include <stdio.h> 

int main() { 
    printf("Hello world.\n"); 
    return 0; 
} 

$ gcc -static hello.c -o loader 
$ gcc -Wl,--dynamic-linker,./loader hello.c -o hello 
$ ./hello 
Hello world. 
$ ldd ./hello 
Hello world. 

उत्तर

5

अजगर, पर्ल, और अन्य व्याख्या की भाषाओं लोड बातें गतिशील dlopen() का उपयोग कर। (यह मानक लोडर को बदलने के समान नहीं है; वे अभी भी इसका उपयोग कर रहे हैं, और वास्तव में dlopen() ईएलएफ-आधारित सिस्टम पर मानक लोडर में एक हुक है।)

लोड करने योग्य मॉड्यूल के लिए कोई मानक रजिस्ट्री नहीं है। पाइथन अपने नियमों का उपयोग यह निर्धारित करने के लिए करता है कि एक्सटेंशन मॉड्यूल कहां से लोड किए जा सकते हैं (sys.path देखें), जिनमें साझा ऑब्जेक्ट्स शामिल हैं। पर्ल विभिन्न नियमों का उपयोग करता है। अपाचे अभी भी विभिन्न नियमों का उपयोग करता है, इत्यादि।

तो अपने प्रश्नों के उत्तर संक्षेप में प्रस्तुत करने:

  1. बिल्कुल

  2. कोई

+0

ठीक है, धन्यवाद, मैंने थोड़ा जवाब संपादित किया और इसे स्वीकार कर लिया। – Davide

0

एक तरफ ध्यान दें, पूरा करने के लिए मैं क्या सवाल में चाहता था एक संभव तरीके के रूप में 2 होगा:

  • वहाँ में एक खाली chrooted पर्यावरण

  • recompile अजगर बनाने के लिए, मैन्युअल रूप से कुछ भी है कि याद आ रही है जोड़ने, एक-एक करके

अपने लक्ष्यों के आधार पर, इस या एक अच्छा समाधान नहीं हो सकता है हो सकता है (और वास्तव में मेरे लक्ष्यों के लिए बहुत बुरा नहीं लगता है - यह अजीब है क्योंकि यह सवाल से सुना जा सकता है)

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