如何强制在系统库上使用本地共享库?

Elo*_*off 12 c c++ linux linker shared-libraries

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

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

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

然后我将LD_LIBRARY_PATH设置为我的project/lib目录并导出它,然后运行我的可执行文件.不知怎的,它仍然在拿起系统库(由gdb和ldd确认)

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

Nik*_* C. 23

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

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

-L告诉链接器在链接时在哪里找到您的库,并-rpath告诉它在运行时搜索库的位置.

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

  • 我非常确定只有rpath*将*追加到rpath:当库存在于标准位置时,仍然会使用它. (2认同)

Mar*_*k B 8

我不得不质疑你为什么要在系统提供的版本上使用你自己的库版本(浮动多个不同的版本只是一个麻烦和用户混淆的方法).

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

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

  • 您这样做的原因可能有很多,例如,在不使用生产软件的共享系统上干扰其他用户的情况下,构建实验性软件 (2认同)