我想将libsqlite3
替换为Python的特殊版本。
我有libsqlite3.so.0 /path/to/libsqlite3.so.0
的特殊版本并配置了LD_LIBRARY_PATH
。
但是,python的内部不会加载它。
我检查过并注意到以下内容:
import sqlite3
加载了python的原始/usr/lib/python2.7/sqlite/__init__.py
和dbapi2.py
。dbapi2.py
导入_sqlite
,这表示/usr/lib/python2.7//lib-dynload/_sqlite3.so
。_sqlite3.so
始终加载/usr/lib/i386-linux-gnu/libsqlite3.so.0
,尽管设置了LD_LIBRARY_PATH
。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
(仅限非特权权限)。
答案 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()的联机帮助页说顺序是:
(仅限ELF)如果调用程序的可执行文件包含DT_RPATH标记,并且不包含DT_RUNPATH标记,则会搜索DT_RPATH标记中列出的目录。
如果在程序启动时,环境变量LD_LIBRARY_PATH被定义为包含以冒号分隔的目录列表,则会搜索这些目录。 (作为安全措施,set-user-ID和set-group-ID程序将忽略此变量。)
...
因此,如果在二进制文件上设置了DT_RPATH,则会在LD_LIBRARY_PATH之前进行。