2008-09-08 20 views
156

मुझे पता है जो पुस्तकालय अपने सिस्टम पर निष्पादनयोग्य द्वारा किया जाता है चाहते हैं। अधिक विशेष रूप से, मैं रैंक करना चाहता हूं कि कौन से पुस्तकालयों का उपयोग सबसे अधिक किया जाता है, साथ ही उन बाइनरी के साथ भी उपयोग किया जाता है। मैं यह कैसे कर सकता हूँ?Linux में निष्पादन योग्य द्वारा उपयोग की जाने वाली सभी साझा लाइब्रेरी को कैसे दिखाया जाए?

+0

यदि एक्जिक्यूटिव 'dlopen' का उपयोग करते हैं तो आप शायद सटीक संख्या प्राप्त नहीं कर पाएंगे। – jxh

उत्तर

200
  1. प्रत्येक निष्पादन योग्य के लिए साझा लाइब्रेरी सूचीबद्ध करने के लिए ldd का उपयोग करें।
  2. सफाई उत्पादन
  3. क्रमबद्ध, गणना मायने रखता है, तरह से

गिनती "/ बिन" निर्देशिका में सभी निष्पादन योग्य के लिए इस सवाल का जवाब ढूंढने के लिए:

find /bin -type f -perm /a+x -exec ldd {} \; \ 
| grep so \ 
| sed -e '/^[^\t]/ d' \ 
| sed -e 's/\t//' \ 
| sed -e 's/.*=..//' \ 
| sed -e 's/ (0.*)//' \ 
| sort \ 
| uniq -c \ 
| sort -n 

बदलें "/ बिन" सभी निर्देशिकाओं को खोजने के लिए "/" से ऊपर। (बस/bin निर्देशिका के लिए)

आउटपुट कुछ इस तरह दिखेगा:

1 /lib64/libexpat.so.0 
    1 /lib64/libgcc_s.so.1 
    1 /lib64/libnsl.so.1 
    1 /lib64/libpcre.so.0 
    1 /lib64/libproc-3.2.7.so 
    1 /usr/lib64/libbeecrypt.so.6 
    1 /usr/lib64/libbz2.so.1 
    1 /usr/lib64/libelf.so.1 
    1 /usr/lib64/libpopt.so.0 
    1 /usr/lib64/librpm-4.4.so 
    1 /usr/lib64/librpmdb-4.4.so 
    1 /usr/lib64/librpmio-4.4.so 
    1 /usr/lib64/libsqlite3.so.0 
    1 /usr/lib64/libstdc++.so.6 
    1 /usr/lib64/libz.so.1 
    2 /lib64/libasound.so.2 
    2 /lib64/libblkid.so.1 
    2 /lib64/libdevmapper.so.1.02 
    2 /lib64/libpam_misc.so.0 
    2 /lib64/libpam.so.0 
    2 /lib64/libuuid.so.1 
    3 /lib64/libaudit.so.0 
    3 /lib64/libcrypt.so.1 
    3 /lib64/libdbus-1.so.3 
    4 /lib64/libresolv.so.2 
    4 /lib64/libtermcap.so.2 
    5 /lib64/libacl.so.1 
    5 /lib64/libattr.so.1 
    5 /lib64/libcap.so.1 
    6 /lib64/librt.so.1 
    7 /lib64/libm.so.6 
    9 /lib64/libpthread.so.0 
13 /lib64/libselinux.so.1 
13 /lib64/libsepol.so.1 
22 /lib64/libdl.so.2 
83 /lib64/ld-linux-x86-64.so.2 
83 /lib64/libc.so.6 

संपादित करें - निकाली "grep -पी"

+1

यह एक अच्छा जवाब है (मैंने इसे वोट दिया है) लेकिन क्या आप "grep -P '\ t। * So'" कमांड को समझा सकते हैं? मनुष्य के अनुसार, यह पैटर्न को एक perl regexp के रूप में व्याख्या करता है, लेकिन grep का मेरा संस्करण इसका समर्थन नहीं करता है (मनुष्य इंगित करता है कि यह एक सामान्य मुद्दा है)। Regexp का थोड़ा सा पर्ल-विशिष्ट है? –

+2

मुझे लगता है कि आपको 'ldd -v' – MountainX

+33

का उपयोग करने की आवश्यकता हो सकती है, ध्यान रखें कि' ldd' वास्तव में एक विशेष पर्यावरण चर के साथ निष्पादन योग्य चलाता है, और लिनक्स गतिशील लिंकर इस ध्वज को पहचानता है और निष्पादन योग्य चलाने के बजाए पुस्तकालयों को आउटपुट करता है। स्रोत को 'ldd' पर देखें; मेरे सिस्टम पर, यह एक बैश स्क्रिप्ट है। यदि निष्पादन योग्य स्थिर रूप से जुड़ा हुआ है और सिस्को का उपयोग करता है, और एक अलग लोडर निर्दिष्ट करता है, तो यह मनमाने ढंग से बुरी चीजें कर सकता है। इसलिए निष्पादन योग्य पर 'ldd' का उपयोग न करें जिसे आप भरोसा नहीं करते हैं। –

40

क्या एक द्विआधारी का उपयोग करता है पुस्तकालयों में जानने के लिए, ldd

ldd path/to/the/tool 

का उपयोग आप अपने पूरे सिस्टम में टूटने के लिए प्राप्त करने के लिए एक छोटे से खोल स्क्रिप्ट लिखने के लिए होगा।

4

ldd के साथ आप पुस्तकालयों कि उपकरणों का उपयोग कर सकते हैं। उपकरण के एक सेट के लिए पुस्तकालयों के उपयोग को रैंक करने के लिए आप निम्न आदेश की तरह कुछ उपयोग कर सकते हैं।

ldd /bin/* /usr/bin/* ... | sed -e '/^[^\t]/ d; s/^\t\(.* => \)\?\([^ ]*\) (.*/\2/g' | sort | uniq -c 

(यहाँ sed स्ट्रिप्स सभी लाइनों है कि एक टैब और फिल्टर बाहर केवल वास्तविक पुस्तकालयों के साथ शुरू नहीं है। sort | uniq -c के साथ आप एक गिनती यह हुआ समय की संख्या का संकेत के साथ एक पुस्तकालय मिलता है।)

आप अंत में sort -g जोड़ने के लिए उपयोग के क्रम में पुस्तकालयों पाने के लिए चाहते हो सकता है।

ध्यान दें कि आप शायद लाइनों उपरोक्त आदेश के साथ एक दूसरे को न पुस्तकालय लाइनों मिलता है। स्थैतिक निष्पादन योग्यों में से एक ("गतिशील निष्पादन योग्य नहीं") और बिना किसी लाइब्रेरी के। उत्तरार्द्ध linux-gate.so.1 का परिणाम है जो आपके फाइल सिस्टम, लेकिन एक कर्नेल द्वारा "आपूर्ति" में एक पुस्तकालय नहीं है।

5

यूनिक्स प्रणाली पर, लगता है बाइनरी (निष्पादन) नाम परीक्षण है।फिर हम

ldd test 
35

लिनक्स पर है परीक्षण में इस्तेमाल किया पुस्तकालयों सूची निम्न आदेश का उपयोग मैं का उपयोग करें:

lsof -P -T -p Application_PID 

इस की तुलना में बेहतर काम करता है जब ldd निष्पादन एक non default loader

+0

यह पता लगाने के लिए प्रयुक्त होता है कि [मारियाडब वास्तव में टीसी-मॉलोक का उपयोग कर रहा था] (https://github.com/blog/1422-tcmalloc-and-mysql), जो LD_PRELOAD द्वारा लोड हो जाता है। बहुत अच्छा काम करता है। – cmc

+0

मैं ऐसा कुछ ढूंढ रहा था जो मुझे दिए गए ढक्कन के लिए '.so' दिखाएगा। मुझे ठीक इसी की आवश्यकता थी। धन्यवाद! –

44

मैं का उपयोग करता है मेरे एआरएम टूलचेन पर अजीब नहीं था इसलिए मैंने objdump का उपयोग किया:

$ (CROSS_COMPILE) objdump -p

उदाहरण के लिए:

objdump -p /usr/bin/python: 

Dynamic Section: 
    NEEDED    libpthread.so.0 
    NEEDED    libdl.so.2 
    NEEDED    libutil.so.1 
    NEEDED    libssl.so.1.0.0 
    NEEDED    libcrypto.so.1.0.0 
    NEEDED    libz.so.1 
    NEEDED    libm.so.6 
    NEEDED    libc.so.6 
    INIT     0x0000000000416a98 
    FINI     0x000000000053c058 
    GNU_HASH    0x0000000000400298 
    STRTAB    0x000000000040c858 
    SYMTAB    0x0000000000402aa8 
    STRSZ    0x0000000000006cdb 
    SYMENT    0x0000000000000018 
    DEBUG    0x0000000000000000 
    PLTGOT    0x0000000000832fe8 
    PLTRELSZ    0x0000000000002688 
    PLTREL    0x0000000000000007 
    JMPREL    0x0000000000414410 
    RELA     0x0000000000414398 
    RELASZ    0x0000000000000078 
    RELAENT    0x0000000000000018 
    VERNEED    0x0000000000414258 
    VERNEEDNUM   0x0000000000000008 
    VERSYM    0x0000000000413534 
+0

यह भी सुरक्षित होना चाहिए, 'ldd' के विपरीत जो अविश्वसनीय निष्पादन योग्य पर उपयोग नहीं किया जाना चाहिए। – PSkocik

5

ओएस एक्स पर डिफ़ॉल्ट रूप से कोई ldd, objdump या lsof है। which openssl दिया निष्पादन और वर्तमान उपयोगकर्ता पर्यावरण के लिए पूरी तरह से योग्य पथ में भर जाता है का उपयोग कर

$ otool -L `which openssl` 
/usr/bin/openssl: 
    /usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8) 
    /usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0) 

इस उदाहरण में,: एक विकल्प के रूप में, otool -L प्रयास करें।

+1

बेशक ओएस एक्स पर 0 lsof' है –

13

चेक साझा एक कार्यक्रम निष्पादन

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

> $ ldd/path/to/कार्यक्रम

ध्यान दें कि यह किसी भी अविश्वसनीय तीसरे पक्ष के निष्पादन के साथ ldd चलाने के लिए क्योंकि ldd के कुछ संस्करणों सीधे अपने पुस्तकालय निर्भरता की पहचान करने के लिए निष्पादन योग्य आह्वान कर सकते हैं सिफारिश नहीं है , जो सुरक्षा जोखिम हो सकता है।

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

$ objdump -p/path/to/program | ग्रेप आवश्यक

for more info

+2

objdump अच्छा है और इसके लिए धन्यवाद .. +1 –

4

readelf -d प्रत्यावर्तन

redelf -dobjdump -p के समान उत्पादन का उत्पादन, जिस पर उल्लेख किया गया था: https://stackoverflow.com/a/15520982/895245

लेकिन सावधान रहना है कि गतिशील पुस्तकालयों अन्य गतिशील पुस्तकालयों पर निर्भर कर सकते हैं, आपको रिकर्स करना है।

उदाहरण:

readelf -d /bin/ls | grep 'NEEDED' 

नमूना ouptut:

0x0000000000000001 (NEEDED)    Shared library: [libselinux.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libacl.so.1] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 

तब:

$ locate libselinux.so.1 
/lib/i386-linux-gnu/libselinux.so.1 
/lib/x86_64-linux-gnu/libselinux.so.1 
/mnt/debootstrap/lib/x86_64-linux-gnu/libselinux.so.1 

चुनें एक है, और दोहराने:

readelf -d /lib/x86_64-linux-gnu/libselinux.so.1 | grep 'NEEDED' 

नमूना उत्पादन:

0x0000000000000001 (NEEDED)    Shared library: [libpcre.so.3] 
0x0000000000000001 (NEEDED)    Shared library: [libdl.so.2] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [ld-linux-x86-64.so.2] 

और इतने पर।

चलाने के लिए /proc/<pid>/maps प्रक्रियाओं

यह सभी पुस्तकालयों वर्तमान में निष्पादनयोग्य चलाकर इस्तेमाल किया जा रहा लगता है उपयोगी है। उदाहरण के लिए:

/lib/x86_64-linux-gnu/ld-2.23.so 
/lib/x86_64-linux-gnu/libapparmor.so.1.4.0 
/lib/x86_64-linux-gnu/libaudit.so.1.0.0 
/lib/x86_64-linux-gnu/libblkid.so.1.1.0 
/lib/x86_64-linux-gnu/libc-2.23.so 
/lib/x86_64-linux-gnu/libcap.so.2.24 
/lib/x86_64-linux-gnu/libdl-2.23.so 
/lib/x86_64-linux-gnu/libkmod.so.2.3.0 
/lib/x86_64-linux-gnu/libmount.so.1.1.0 
/lib/x86_64-linux-gnu/libpam.so.0.83.1 
/lib/x86_64-linux-gnu/libpcre.so.3.13.2 
/lib/x86_64-linux-gnu/libpthread-2.23.so 
/lib/x86_64-linux-gnu/librt-2.23.so 
/lib/x86_64-linux-gnu/libseccomp.so.2.2.3 
/lib/x86_64-linux-gnu/libselinux.so.1 
/lib/x86_64-linux-gnu/libuuid.so.1.3.0 

यह भी देखें:: https://superuser.com/questions/310199/see-currently-loaded-shared-objects-in-linux/1243089

2
ubuntu पर

प्रिंट एक निष्पादन

से संबंधित संकुल

sudo awk '/\.so/{print $6}' /proc/1/maps | sort -u 

सभी वर्तमान में लोड गतिशील (पीआईडी ​​1) init की निर्भरता से पता चलता ldd execable_name | awk '{print $ 3}' | xargs dpkg -S | awk -F ":" 'प्रिंट $ 1} '

0

मुझे यह पोस्ट बहुत उपयोगी पाया क्योंकि मुझे किसी तृतीय पक्ष की आपूर्ति लाइब्रेरी (32 बनाम 64 बिट निष्पादन पथ) से निर्भरताओं की जांच करने की आवश्यकता थी।

मैंने एक आरएचईएल 6 डिस्ट्रो पर 'readelf -d' सुझाव के आधार पर एक क्यू & डी रिकर्सिंग बैश स्क्रिप्ट को एक साथ रखा।

यह बहुत ही बुनियादी है और प्रत्येक बार निर्भरता का परीक्षण करेगा, भले ही इसका परीक्षण पहले किया जा सके (यानी बहुत verbose)। आउटपुट भी बहुत बुनियादी है।

#! /bin/bash 

recurse() 
# Param 1 is the nuumber of spaces that the output will be prepended with 
# Param 2 full path to library 
{ 
#Use 'readelf -d' to find dependencies 
dependencies=$(readelf -d ${2} | grep NEEDED | awk '{ print $5 }' | tr -d '[]') 
for d in $dependencies; do 
    echo "${1}${d}" 
    nm=${d##*/} 
    #libstdc++ hack for the '+'-s 
    nm1=${nm//"+"/"\+"} 
    # /lib /lib64 /usr/lib and /usr/lib are searched 
    children=$(locate ${d} | grep -E "(^/(lib|lib64|usr/lib|usr/lib64)/${nm1})") 
    rc=$? 
    #at least locate... didn't fail 
    if [ ${rc} == "0" ] ; then 
     #we have at least one dependency 
     if [ ${#children[@]} -gt 0 ]; then 
     #check the dependeny's dependencies 
     for c in $children; do 
      recurse " ${1}" ${c} 
     done 
     else 
     echo "${1}no children found" 
     fi 
    else 
     echo "${1}locate failed for ${d}" 
    fi 
done 
} 
# Q&D -- recurse needs 2 params could/should be supplied from cmdline 
recurse "" !!full path to library you want to investigate!! 

, निश्चित रूप से अपने जोखिम पर एक फ़ाइल और, 'पाया' या 'विफल'

उपयोग और संशोधित करने के लिए ग्रेप के उत्पादन अनुप्रेषित के रूप में आप चाहते हैं।

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

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