libsqlite3.so загрузка на Python - PullRequest
1 голос
/ 16 февраля 2012

Я хочу заменить libsqlite3 специальной версией для Python. У меня есть специальная версия libsqlite3.so.0 /path/to/libsqlite3.so.0 и настроена LD_LIBRARY_PATH. Тем не менее, внутренний Python не будет загружать его.

Я проверил и заметил следующее:

  1. import sqlite3 загружает оригинал Python /usr/lib/python2.7/sqlite/__init__.py и dbapi2.py.
  2. dbapi2.py импортирует _sqlite, и это указывает /usr/lib/python2.7//lib-dynload/_sqlite3.so.
  3. _sqlite3.so всегда загружает /usr/lib/i386-linux-gnu/libsqlite3.so.0, несмотря на настройку LD_LIBRARY_PATH.
  4. Если я копирую libpthread.so.0 в /path/to/libpthread.so.0, _sqlite3.so загружает его. Итак, /path/to/libpthread.so.0 загружен, но /path/to/libsqlite3.so.0 не загружен.

Я хочу знать, как загрузить /path/to/libsqlite3.so.0, специальную версию без замены /usr/lib/i386-linux-gnu/libsqlite3.so.0 (только с непривилегированным разрешением).

1 Ответ

4 голосов
/ 16 февраля 2012

Вы можете попытаться принудительно загрузить библиотеку с помощью:

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

Библиотека будет загружена в память при запуске Python.Поэтому обычно, когда модуль _sqlite3 будет импортирован, он не будет загружать libsqlite3.so.0 и использовать версию, уже загруженную в память.

Редактировать

LD_LIBRARY_PATH в этом случае не работает, потому что libsqlite3.so.0 загружается модулем _sqlite.so, загружается dlopen () в Python.В этом случае man-страница dlopen () говорит, что порядок:

  1. (только ELF) Если исполняемый файл для вызывающей программы содержит тег DT_RPATH и не содержитВ теге DT_RUNPATH производится поиск в каталогах, перечисленных в теге DT_RPATH.

  2. Если во время запуска программы переменная среды LD_LIBRARY_PATH была определена как содержащая список, разделенный двоеточиямииз каталогов, то они ищутся.(В качестве меры безопасности эта переменная игнорируется для программ set-user-ID и set-group-ID.)

  3. ...

Таким образом, если DT_RPATH установлен в двоичном файле, он будет принят до вашего LD_LIBRARY_PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...