সঞ্চালনের সময় ডায়নামিক লাইব্রেরিগুলি এক্সিকিউটেবল লোডগুলি কীভাবে সন্ধান করবেন?


64

আমি যখন চালিত হয় তখন ডাইনামিক লাইব্রেরিগুলির তালিকা খুঁজে বের করতে চাই বাইনারি লোডগুলি (তাদের সম্পূর্ণ পাথ সহ)। আমি CentOS 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
এর ম্যাকোস সমতুল্য কি হবে তার কোনও ধারণা? lldডারউইনের উপর নেই , এটি প্রদর্শিত হবে, না আমি হোমব্রুয়ের মাধ্যমে এটি খুঁজে পাব না।
mz2

7
ম্যাকোজে:otool -L <path-to-binary>
রিচার্ড ভিনি

সচেতন থাকুন যে এটি বাইনারি কার্যকর করতে পারে। সুতরাং বাইনারি যদি অবিশ্বস্ত হয় তবে এটি ব্যবহার না করাই ভাল lddম্যান পৃষ্ঠা দেখুন ।
পল রুনি

46

readelf -d $executable | grep 'NEEDED'

আপনি যদি এক্সিকিউটেবল চালাতে না পারেন তবে এটি ব্যবহার করা যেতে পারে, যেমন এটি ক্রস সংকলিত ছিল বা আপনি যদি এটি বিশ্বাস করেন না:

সাধারণ ক্ষেত্রে, এলডিডি স্ট্যান্ডার্ড ডায়নামিক লিংক (ld.so (8) দেখুন) সাথে LD_TRACE_LOADED_OBJECTS এনভায়রনমেন্ট ভেরিয়েবল 1 সেট করে, যার ফলে লিংকটি লাইব্রেরি নির্ভরতা প্রদর্শন করে। তবে সচেতন থাকুন যে, কিছু পরিস্থিতিতে, ldd- র কিছু সংস্করণ সরাসরি প্রোগ্রামটি চালিয়ে নির্ভরতা সম্পর্কিত তথ্য অর্জনের চেষ্টা করতে পারে। সুতরাং, আপনার কখনই অবিশ্বস্ত এক্সিকিউটেবলের উপর ldd নিয়োগ করা উচিত নয়, কারণ এটি স্বেচ্ছাসেবক কোড কার্যকর করতে পারে।

উদাহরণ:

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

নমুনা আউটপুট:

 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
রিডফেল পদ্ধতি সম্পর্কে দুর্দান্ত অংশটি হ'ল এটি ক্রস-বাইনারিগুলির উপরও কাজ করে (উদা: এমএডি on on তে আর্মফ)
ঘোস্ট্রিডার

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" নামগুলি গ্রেপ করতে পারে।


3
একটি উন্নতি:strace -e trace=open,openat myprogram
সাইকার

দুর্দান্ত পদ্ধতি। বিবিডাব্লুও/proc/<pid>/maps দেখায় dlopen: unix.stackexchange.com/questions/120015/… ltrace -S আউটপুট এমনকি শীতল যেমন এটি উভয় সাইস্কেল এবং লাইব্রেরি কলগুলি দেখায় যেমন dlopen: unix.stackexchange.com/questions/226524/…
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四事件

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

একটি জন্য প্রক্রিয়া PID 1234 এর, এছাড়াও আপনি পড়তে পারি /proc/1234/maps(পাঠগত) সিউডো-ফাইল (পড়া proc (5) ...) বা ব্যবহার pmap (1)

এটি সেই প্রক্রিয়াটির ভার্চুয়াল ঠিকানার স্থান দেয় , সুতরাং মেমরি ম্যাপ করা ফাইলগুলি (ভাগ করে নেওয়া লাইব্রেরিগুলি এমনকি ড্লোপেন (3) -যুক্ত একটি সহ)

(অবশ্যই, ব্যবহার 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.