如何强制在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。
答案 0 :(得分:22)
链接时,指定库的目录并使用rpath:
-Wl,-rpath,/absolute/path/to/your/library -L/absolute/path/to/your/library -llibrary
-L
告诉链接器在链接时在哪里找到您的库,-rpath
告诉它在运行时搜索库的位置。
请注意-L
和-rpath
需要包含.so文件的目录,而不是库文件本身的实际路径。
答案 1 :(得分:9)
我不得不质疑你为什么要在系统提供的版本上使用你自己的库版本(浮动多个不同的版本只是一个麻烦和用户混淆的方法)。
但是,您应该能够export LD_PRELOAD=<path_to_your_shared_obj>
强制它加载您自己的版本。
请注意,任何覆盖库版本的机制都不会通过任何类型的权限提升而保留(例如sudo
)。