gpt4 book ai didi

python - libsqlite3.so 在 Python 上加载

转载 作者:太空宇宙 更新时间:2023-11-04 10:56:33 25 4
gpt4 key购买 nike

我想用 Python 的特殊版本替换 libsqlite3。我有一个特殊版本的 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

我想知道如何加载特殊版本/path/to/libsqlite3.so.0,而不替换/usr/lib/i386-linux-gnu/libsqlite3。 so.0(仅具有非特权权限)。

最佳答案

您可以尝试强制加载库:

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. ...

因此,如果在二进制文件上设置了 DT_RPATH,它将优先于您的 LD_LIBRARY_PATH。

关于python - libsqlite3.so 在 Python 上加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9315095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com