如何强制使用本地共享库而不是系统库

How to force using local shared libraries over system libraries?

本文关键字:系统库 共享 何强制      更新时间:2023-10-16

如何在 Linux 中强制使用本地库而不是系统库?

我将我的可执行文件显式链接到我的项目/lib 目录中的一些 .so 文件,例如 (../lib/libluajit.so).

在 gdb 下运行我的可执行文件或使用 ldd 表明它仍然使用 libluajit-5.1.so.2 系统

然后,我将LD_LIBRARY_PATH设置为我的项目/lib 目录并将其导出,然后运行我的可执行文件。不知何故,它仍在拾取系统库(由 gdb 和 ldd 确认)

我想知道这怎么可能,以及我可以做些什么来强制它使用我的项目/lib 目录中的本地 libluajit.so。

链接时,请指定库的目录,并使用 rpath:

-
wl,-rpath,/absolute/path/to/your/library -L/absolute/path/to/your/library -llibrary

-L告诉链接器在链接时在哪里可以找到库,-rpath告诉它在运行时在哪里搜索库。

请注意,-L-rpath需要包含 .so 文件的目录,而不是库文件本身的实际路径。

我不得不质疑为什么你想使用自己的库版本而不是系统提供的版本(有多个不同的版本浮动只不过是麻烦和用户混淆的秘诀)。

但是,您应该能够export LD_PRELOAD=<path_to_your_shared_obj>强制它加载您自己的版本。

请注意,覆盖库版本的机制不会通过任何类型的特权提升(例如 sudo )保留。