2012-07-31 110 views
1

我有一个可执行文件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

如果我理解正确的手册页, LD_LIBRARY_PATH应该取代系统范围的路径,如/usr/lib64,所以我不确定为什么这不起作用。

这是一个setuid/setgid程序吗?那些LD_LIBRARY_PATH被忽略。

当前路径(.)是否更改,以致LD_LIBRARY_PATH=.不再让libB找到libC?

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

0

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