在Python上加载libsqlite3.so

时间:2012-02-16 16:30:35

标签: python sqlite

我想将libsqlite3替换为Python的特殊版本。 我有libsqlite3.so.0 /path/to/libsqlite3.so.0的特殊版本并配置了LD_LIBRARY_PATH。 但是,python的内部不会加载它。

我检查过并注意到以下内容:

  1. import sqlite3加载了python的原始/usr/lib/python2.7/sqlite/__init__.pydbapi2.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
  5. 我想知道如何加载/path/to/libsqlite3.so.0这是一个特殊版本而不替换/usr/lib/i386-linux-gnu/libsqlite3.so.0(仅限非特权权限)。

1 个答案:

答案 0 :(得分:4)

您可能会尝试使用以下命令加载lib:

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

当执行python时,库将被加载到内存中。因此,通常在导入_sqlite3模块时,它不会加载libsqlite3.so.0,并使用已预先加载到内存中的版本。

修改

LD_LIBRARY_PATH在这种情况下不起作用,因为libsqlite3.so.0由_sqlite.so模块加载,由Python中的dlopen()加载。在这种情况下,dlopen()的联机帮助页说顺序是:

  1. (仅限ELF)如果调用程序的可执行文件包含DT_RPATH标记,并且不包含DT_RUNPATH标记,则会搜索DT_RPATH标记中列出的目录。

  2. 如果在程序启动时,环境变量LD_LIBRARY_PATH被定义为包含以冒号分隔的目录列表,则会搜索这些目录。 (作为安全措施,set-user-ID和set-group-ID程序将忽略此变量。)

  3. ...

  4. 因此,如果在二进制文件上设置了DT_RPATH,则会在LD_LIBRARY_PATH之前进行。