रन करते समय गतिशील पुस्तकालयों के निष्पादन योग्य भार का पता कैसे लगाएं?


63

मैं गतिशील पुस्तकालयों की सूची का पता लगाना चाहता हूं जब रन (उनके पूर्ण पथ के साथ) एक द्विआधारी लोड करता है। मैं सेंटोस 6.0 का उपयोग कर रहा हूं। यह कैसे करना है?

जवाबों:


61

आप इसे lddकमांड से कर सकते हैं :

NAME
       ldd - print shared library dependencies

SYNOPSIS
       ldd [OPTION]...  FILE...

DESCRIPTION
       ldd  prints  the  shared  libraries  required by each program or shared
       library specified on the command line.
....

उदाहरण:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff87ffe000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007ff0510c1000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff050eb9000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007ff050cb0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff0508f0000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff0506ec000)
    /lib64/ld-linux-x86-64.so.2 (0x00007ff0512f7000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff0504ce000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007ff0502c9000)

1
किसी भी विचार क्या macOS इस के बराबर होगा? lldडार्विन पर नहीं , यह प्रतीत होता है, और न ही मैं इसे होमब्रे के माध्यम से पा सकता हूं।
mz2

7
मैकओएस पर:otool -L <path-to-binary>
रिचर्ड विनी

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

45

readelf -d $executable | grep 'NEEDED'

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

सामान्य स्थिति में, ldd LD_TRACE_LOADED_OBJECTS पर्यावरण चर के साथ मानक डायनामिक लिंकर (ld.so (8) देखें) को सेट करता है, जिससे लिंकर लाइब्रेरी की निर्भरता प्रदर्शित करता है। हालाँकि, अवगत रहें, कि कुछ परिस्थितियों में, ldd के कुछ संस्करण प्रोग्राम को सीधे निष्पादित करके निर्भरता की जानकारी प्राप्त करने का प्रयास कर सकते हैं। इस प्रकार, आपको कभी भी एक अविश्वसनीय निष्पादन योग्य पर काम नहीं करना चाहिए, क्योंकि इससे मनमाने कोड का निष्पादन हो सकता है।

उदाहरण:

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

लेकिन अधिक सटीक तरीका lddखोज पथ / कैश को समझना है । मुझे लगता ldconfigहै कि जाने का रास्ता है।

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

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 प्रक्रियाओं को चलाने के लिए

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

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

init(पीआईडी 1) की वर्तमान में भरी हुई सभी गतिशील निर्भरता दिखाता है :

/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

यह विधि उबंटू 18.04 के साथ हैक किए गए इस न्यूनतम सेटअप केdlopen साथ परीक्षण किए गए पुस्तकालयों को भी दिखाती है ।sleep(1000)

यह भी देखें: लिनक्स में वर्तमान में लोड की गई साझा वस्तुओं को कैसे देखें? | सुपर यूजर


1
साथ ही: readelf विधि के बारे में अच्छा हिस्सा है कि यह पार बाइनरी पर काम करता है (amd64 पर armhf पूर्व) है
ghostrider

13

ldd और lsof पुस्तकालयों को सीधे या किसी दिए गए क्षण में लोड करके दिखाते हैं । वे पुस्तकालयों के माध्यम से लोड dlopen(या द्वारा त्यागdlclose ) के लिए जिम्मेदार नहीं हैं । आप इस का एक बेहतर चित्र प्राप्त कर सकते हैं strace, जैसे,

strace -e trace=open myprogram

(चूंकि dlopenअंततः कॉल करता है open- हालांकि आपके पास 64-बिट खुलने के लिए अलग-अलग नामों का उपयोग करने वाला सिस्टम हो सकता है ...)।

उदाहरण:

strace -e trace=open date

मुझे यह दिखाता है:

open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
open("/etc/localtime", O_RDONLY)        = 3
Wed Apr 12 04:56:32 EDT 2017

जिसमें से केवल साझा किए गए ऑब्जेक्ट्स को देखने के लिए ".so" नामों को grep किया जा सकता है।


3
एक सुधार:strace -e trace=open,openat myprogram
साइकर

अच्छी विधि है। लिबास btw को /proc/<pid>/mapsभी दिखाता है dlopen: unix.stackexchange.com/questions/120015/… ltrace -S आउटपुट भी ठंडा है क्योंकि यह दोनों syscalls और पुस्तकालय कॉल को दिखाता है जैसे dlopen: unix.stackexchange.com/questions/22x24/…
Ciro Santilli 新疆 tw tw tw tw事件

7

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

अर्थात

$ pidof nginx
6920 6919

$ lsof -p 6919|grep mem
nginx   6919 root  mem    REG               0,64    65960     43 /lib64/libnss_files-2.12.so
nginx   6919 root  mem    REG               0,64    19536     36 /lib64/libdl-2.12.so
nginx   6919 root  mem    REG               0,64    10312   1875 /lib64/libfreebl3.so
nginx   6919 root  mem    REG               0,64  1923352     38 /lib64/libc-2.12.so
nginx   6919 root  mem    REG               0,64    88600   1034 /lib64/libz.so.1.2.3
nginx   6919 root  mem    REG               0,64  1967392   1927 /usr/lib64/libcrypto.so.1.0.1e
nginx   6919 root  mem    REG               0,64   183080   1898 /lib64/libpcre.so.0.0.1
nginx   6919 root  mem    REG               0,64    40400   1217 /lib64/libcrypt-2.12.so
nginx   6919 root  mem    REG               0,64   142688     77 /lib64/libpthread-2.12.so
nginx   6919 root  mem    REG               0,64   154664     31 /lib64/ld-2.12.so

2

पृष्ठ 1234 की प्रक्रिया के लिए , आप /proc/1234/maps(पाठ) छद्म फ़ाइल (पढ़ी गई (5) ...) पढ़ सकते हैं या pmap (1) का उपयोग कर सकते हैं

यह उस प्रक्रिया का आभासी पता स्थान देता है, इसलिए फ़ाइलें (साझा लाइब्रेरी सहित, यहां तक ​​कि dlopen (3) -ed एक) जो मेमोरी मैप की जाती हैं

(जाहिर है, का उपयोग करें ps auxया pgrep (1) कुछ दिया कार्यक्रम प्रक्रिया चल खोजने के लिए)


1

बड़े पैमाने पर क्वेरी के लिए:

  1. एक छोटी स्क्रिप्ट बनाएं ( useslib) और PATH में डालें (नीचे दिए गए कमांड में एक पूर्ण पथ को व्यवस्थित करें)

    #! /bin/bash
    ldd $1 | grep -q $2
    exit $?
    
  2. findउदाहरण के लिए, इसका उपयोग करें :

    find /usr/bin/ -executable -type f -exec useslib {} libgtk-x11-2.0 \; -print
    

(libgtk-x11-2.0 gtk2 lib लगता है)


0

इसका उपयोग संभव है pmap

उदाहरण के लिए, एक प्रक्रिया शुरू करें: $ watch date

पिद प्राप्त करें: $ ps -ef | grep watch

स्मृति मानचित्र दिखाएं: $ pmap <pid>

पूर्ण पथ के साथ दिखाएँ: $ pmap <pid> -p

$ pmap 72770
72770:   watch date
00005613a32c9000     20K r-x-- watch
00005613a34cd000      4K r---- watch
00005613a34ce000      4K rw--- watch
00005613a4f6a000    264K rw---   [ anon ]
00007f2f3a7d5000 204616K r---- locale-archive
00007f2f46fa7000   1748K r-x-- libc-2.27.so
00007f2f4715c000   2048K ----- libc-2.27.so
00007f2f4735c000     16K r---- libc-2.27.so
00007f2f47360000      8K rw--- libc-2.27.so
00007f2f47362000     16K rw---   [ anon ]
00007f2f47366000     12K r-x-- libdl-2.27.so
00007f2f47369000   2044K ----- libdl-2.27.so
00007f2f47568000      4K r---- libdl-2.27.so
00007f2f47569000      4K rw--- libdl-2.27.so
00007f2f4756a000    160K r-x-- libtinfo.so.6.1
00007f2f47592000   2048K ----- libtinfo.so.6.1
00007f2f47792000     16K r---- libtinfo.so.6.1
00007f2f47796000      4K rw--- libtinfo.so.6.1
00007f2f47797000    232K r-x-- libncursesw.so.6.1
00007f2f477d1000   2048K ----- libncursesw.so.6.1
00007f2f479d1000      4K r---- libncursesw.so.6.1
00007f2f479d2000      4K rw--- libncursesw.so.6.1
00007f2f479d3000    148K r-x-- ld-2.27.so
00007f2f47bdb000     20K rw---   [ anon ]
00007f2f47bf1000     28K r--s- gconv-modules.cache
00007f2f47bf8000      4K r---- ld-2.27.so
00007f2f47bf9000      4K rw--- ld-2.27.so
00007f2f47bfa000      4K rw---   [ anon ]
00007ffd39404000    136K rw---   [ stack ]
00007ffd3959b000     12K r----   [ anon ]
00007ffd3959e000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total           215692K
$ pmap 72770 -p
72770:   watch date
00005613a32c9000     20K r-x-- /usr/bin/watch
00005613a34cd000      4K r---- /usr/bin/watch
00005613a34ce000      4K rw--- /usr/bin/watch
00005613a4f6a000    264K rw---   [ anon ]
00007f2f3a7d5000 204616K r---- /usr/lib/locale/locale-archive
00007f2f46fa7000   1748K r-x-- /usr/lib64/libc-2.27.so
00007f2f4715c000   2048K ----- /usr/lib64/libc-2.27.so
00007f2f4735c000     16K r---- /usr/lib64/libc-2.27.so
00007f2f47360000      8K rw--- /usr/lib64/libc-2.27.so
00007f2f47362000     16K rw---   [ anon ]
00007f2f47366000     12K r-x-- /usr/lib64/libdl-2.27.so
00007f2f47369000   2044K ----- /usr/lib64/libdl-2.27.so
00007f2f47568000      4K r---- /usr/lib64/libdl-2.27.so
00007f2f47569000      4K rw--- /usr/lib64/libdl-2.27.so
00007f2f4756a000    160K r-x-- /usr/lib64/libtinfo.so.6.1
00007f2f47592000   2048K ----- /usr/lib64/libtinfo.so.6.1
00007f2f47792000     16K r---- /usr/lib64/libtinfo.so.6.1
00007f2f47796000      4K rw--- /usr/lib64/libtinfo.so.6.1
00007f2f47797000    232K r-x-- /usr/lib64/libncursesw.so.6.1
00007f2f477d1000   2048K ----- /usr/lib64/libncursesw.so.6.1
00007f2f479d1000      4K r---- /usr/lib64/libncursesw.so.6.1
00007f2f479d2000      4K rw--- /usr/lib64/libncursesw.so.6.1
00007f2f479d3000    148K r-x-- /usr/lib64/ld-2.27.so
00007f2f47bdb000     20K rw---   [ anon ]
00007f2f47bf1000     28K r--s- /usr/lib64/gconv/gconv-modules.cache
00007f2f47bf8000      4K r---- /usr/lib64/ld-2.27.so
00007f2f47bf9000      4K rw--- /usr/lib64/ld-2.27.so
00007f2f47bfa000      4K rw---   [ anon ]
00007ffd39404000    136K rw---   [ stack ]
00007ffd3959b000     12K r----   [ anon ]
00007ffd3959e000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total           215692K
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.