15

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

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

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

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

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

4

2 回答 2

24

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

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

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

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

于 2012-11-13T19:09:39.753 回答
8

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

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

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

于 2012-11-13T19:08:46.197 回答