2012-04-20 11 views
7

lddは、実行可能ファイルが使用されている、または使用されている共有ライブラリを確認するのに便利です。しかし、それが期待どおりに機能するとは限りません。例えば、それは私が他の多くのディストリビューションを試してみたが、私は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 
をコピーしてるのpythonにバイナリ

をlibreadline「依存」を見つけために「失敗した」方法を示し、次のシェルスニペットを参照してください

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 
$ 

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 

は、バックグラウンドでのPythonの対話セッション(PID 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 

ビンゴスタート!ここはreadlineです!

    しかし、この技術は、pythonのプロセスは、私は2つの質問があるので、from Tkinter import *

    のようなものを実行しなくなるまで、例えばそれが/usr/lib64/libtcl8.4.soを見つけることができませんので、ライブラリが効果的に、ロードされている場合にのみ機能します

  1. 私はlddの問題は、標準のローダーの使用を前提としているのに対し、Pythonは独自の特別なローダーを使用している可能性が高いと考えています(新しいPythonモジュールをインストールするたびに純粋なpythonではなく、いくつかのc/C++/fortranを持っていますコード)。これは正しいです?

  2. 実行可能ファイルが独自のローダーを使用している場合、「この実行可能ファイルがロード可能なすべてのライブラリを見つける方法」という質問に対して明らかな答えはありません。しかし、どのようなライブラリがPythonによって読み込まれるかを知る方法はありますか?

PS:あなたはこの質問に着陸している場合は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

のPythonやPerl、および他のインタプリタ言語dlopen()を使用して動的に物事をロードします。 (これは標準ローダーの置き換えと同じではなく、まだ使用していますが、実際にはdlopen()はELFベースのシステムの標準ローダーへのフックです)。

ロード可能モジュールの標準レジストリはありません。 Pythonは、独自のルールを使用して、共有オブジェクトが関連付けられているモジュールを含め、拡張モジュールをどこからロードできるかを決定します(sys.path参照)。 Perlは異なるルールを使用します。 Apacheはまだ異なるルールなどを使用しています。サイドノート、私が質問に何を望むかを達成するために可能な方法として

  1. ない正確

  2. なし

+0

ありがとう、私はあなたの答えを少し編集して受け入れました。 – Davide

0

:だからあなたの質問への回答を要約する

2は:

  • 手動であなたの目標に応じて、1対1

、欠けている何かを追加して、そこに

  • 再コンパイルパイソンの空chrootされた環境を作成し、これはか良い解決策ではないかもしれないかもしれません(そして実際には私の目標が何であるかにはあまりにも悪くないことが判明しました。質問から聞こえるかもしれないので奇妙です)

  • 関連する問題