更改共享库的链接

时间:2012-07-31 16:00:24

标签: c libraries shared

我有一个可执行文件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不是一个选项,因为我不是该平台的管理员)

由于

2 个答案:

答案 0 :(得分:0)

如果我正确理解联机帮助页,LD_LIBRARY_PATH应该取代/usr/lib64之类的系统范围路径,所以我不确定为什么这样做不起作用。

是setuid / setgid程序吗? LD_LIBRARY_PATH将被忽略。

当前路径(.)是否发生变化,这样LD_LIBRARY_PATH=.不再允许libB找到libC?

通过strace运行程序可以让你看到ldd正在检查libC的目录;这可能有助于您调试搜索的位置和方式。

答案 1 :(得分:0)

我弄清楚问题是什么:我在超级计算机上运行,​​当然有些事情是在程序实际运行之前用环境变量在后台完成的。这弄乱了我的共享库。