2012-02-16 23 views
1

libsqlite3をPythonの特別なバージョンに置き換えたいと思います。 特別なバージョンのlibsqlite3.so.0 /path/to/libsqlite3.so.0があり、LD_LIBRARY_PATHと設定されています。 しかし、pythonの内部はそれをロードしません。libsqlite3.soをPythonに読み込む

私がチェックし、次気づい:

  1. import sqlite3負荷パイソンのオリジナル/usr/lib/python2.7/sqlite/__init__.pydbapi2.pyを。
  2. dbapi2.py_sqliteのインポート/usr/lib/python2.7//lib-dynload/_sqlite3.soを示します。
  3. _sqlite3.soは、LD_LIBRARY_PATHにもかかわらず、常に/usr/lib/i386-linux-gnu/libsqlite3.so.0をロードします。
  4. libpthread.so.0/path/to/libpthread.so.0をコピーすると、_sqlite3.soがロードされます。したがって、/path/to/libpthread.so.0がロードされていますが、/path/to/libsqlite3.so.0がロードされていません。

は、私は(唯一の非特権許可を得て)/usr/lib/i386-linux-gnu/libsqlite3.so.0を交換せずに、/path/to/libsqlite3.so.0、特別なバージョンをロードする方法を知りたいです。

答えて

4

あなたはとLIBのロードを強制しようとする可能性があります:pythonが実行されるとき、ライブラリがメモリにロードされます

LD_PRELOAD=/path/to/libsqlite3.so.0 python ... 

。したがって、普通は_sqlite3モジュールをインポートすると、libsqlite3.so.0はロードされず、メモリにすでにプリロードされているバージョンが使用されます。

編集

LD_LIBRARY_PATHが原因libsqlite3.so.0はPython内のdlopen()によってロードされ、_sqlite.soモジュールによってロードされた場合には動作しません。その場合には、dlopenを()のmanページには順序があることを言った:

  1. (ELFのみ)呼び出し元プログラムの実行ファイルにDT_RPATHタグが含まれ、その後、DT_RUNPATHタグが含まれていない場合DT_RPATHタグにリストされているディレクトリが検索されます。

  2. プログラムが開始された時点で、環境変数LD_LIBRARY_PATHがディレクトリのコロン区切りリストを含むように定義されていた場合は、これらが検索されます。 (セキュリティ対策として、この変数がセットユーザIDに対しては無視とset-group-IDプログラムされています。)

  3. ...

だからDT_RPATHがバイナリに設定されている場合、それはLD_LIBRARY_PATHの前に取得されます。

+0

ありがとう、それは動作しますが、私はLD_PRELOADを使用する必要がありますか? LD_LIBRARY_PATHを設定すると、libpthread.so.0の代わりに動作しますが、libsqlite3.so.0を置き換えません。私はこの事実に悩まされている。 2つのライブラリの違いは何ですか? –

+0

libpthread.so.0はPython自体によって読み込まれ( '' ldd /usr/bin/python2.7'') '' libsqlite3.so.0は_sqlite.soによって読み込まれ、Pythonではdlopen()によって読み込まれます。 LD_LIBRARY_PATHがそのように動作しない理由はわかりません。おそらく_sqlite.soのrpathの原因でしょうか? – tito

+0

これはrpathの原因で、dlopen()のマンページを調べると、優先順位が説明されています:1. rpath、2。LD_LIBRARY_PATH、3. runpath、... – tito

関連する問題