我有一个可执行文件A,它使用dlopen
打开一个共享库libB.so(位于同一目录中,所以我做了LD_LIBRARY_PATH =。让我的程序正确找到它)。这个库libB.so应该在libC.so中找到它的一些符号,它也位于同一目录中。
但是,在/ usr / lib64中还有一个libC.so(已经使用不同的参数进行编译,因此它没有相同的符号),并且由于未知原因,libB.so试图打开这个在同一目录中的那个。当我执行ldd libB.so
时,我可以看到libC.so => /usr/lib64/libC.so
而不是libC.so => /path/to/program/A/libC.so
。
有没有办法在libB.so中更改此链接(如果可能,不重新编译),或者如果我应该重新编译libB.so,是什么使编译器选择在/ usr / lib64中使用libC.so而不是其他一个?
(注意:在/ usr / lib64中替换libC.so不是一个选项,因为我不是该平台的管理员)
由于
答案 0 :(得分:0)
如果我正确理解联机帮助页,LD_LIBRARY_PATH应该取代/usr/lib64
之类的系统范围路径,所以我不确定为什么这样做不起作用。
是setuid / setgid程序吗? LD_LIBRARY_PATH将被忽略。
当前路径(.
)是否发生变化,这样LD_LIBRARY_PATH=.
不再允许libB找到libC?
通过strace运行程序可以让你看到ldd正在检查libC的目录;这可能有助于您调试搜索的位置和方式。
答案 1 :(得分:0)
我弄清楚问题是什么:我在超级计算机上运行,当然有些事情是在程序实际运行之前用环境变量在后台完成的。这弄乱了我的共享库。