Überprüfen von gemeinsam genutzten Bibliotheken auf nicht standardmäßige Lader

ldd Dies ist eine gute einfache Methode, um nach gemeinsam genutzten Bibliotheken zu suchen, die von einer bestimmten ausführbaren Datei verwendet werden oder werden. Es funktioniert jedoch nicht immer wie erwartet. Im folgenden Shell-Snippet sehen Sie beispielsweise, wie es "fehlschlägt", die libreadline "dependency" in der Python-Binärdatei zu finden

Ich habe viele andere Distributionen ausprobiert, aber ich kopiere aus Tikanga

<code>$ 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
</code>

Sehen Sie wasldd funktioniert standardmäßig installiertpython (aus offiziellen Repositories).

<code>$ 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
$
</code>

Über readline wurde nichts gefunden. Jetzt weiß ich aus der interaktiven Verwendung, dass diese Binärdatei über echte Funktionalität verfügt. Versuchen Sie also nicht, herauszufinden, woher sie stammt.

<code>$ 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
</code>

Startete eine interaktive Python-Sitzung im Hintergrund (pid 21003)

<code>$ 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
</code>

Bingo! Hier ist es readline!

Diese Technik funktioniert jedoch nur, wenn die Bibliothek effektiv geladen ist, sodass sie beispielsweise nicht gefunden wird/usr/lib64/libtcl8.4.so bis der python prozess sowas nicht mehr läuftfrom Tkinter import *

Ich habe also zwei Fragen:

Ich glaube das Problem mitldd ist, dass es die Verwendung des Standard-Loaders voraussetzt, wohingegen Python sehr wahrscheinlich einen eigenen speziellen Loader verwendet (damit Sie die ausführbare Datei nicht jedes Mal neu verknüpfen müssen, wenn Sie ein neues Python-Modul installieren, das kein reines Python ist, sondern einige c / c ++ / fortran code). Ist das richtig?

Wenn eine ausführbare Datei ihren eigenen Loader verwendet, gibt es keine offensichtliche Antwort auf die Frage "Wie finde ich alle möglichen Bibliotheken, die diese ausführbare Datei laden kann": Es hängt davon ab, was der Loader tut. Aber gibt es eine Möglichkeit herauszufinden, welche Bibliotheken von Python geladen werden können?

PS: bezogen auf 1. Wenn Sie auf dieser Frage landen, sollten Sie bereits Folgendes wissen, aber wenn nicht, sollten Sie: sehen, wie einfach es ist, alles durcheinander zu bringenldd Ausgabe (es ist etwas schwieriger, es nur teilweise zu vermasseln):

<code>$ 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.
</code>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage