静态链接到动态库。glibc

4
所以,我的问题是在一台机器上有两个版本的GCC。
3.4.6和4.1。这是由于新软件的某些依赖问题所致。(需要glibc 4.1)。当我尝试将此新软件与4.1库链接时,链接顺利完成。但是,在执行该软件时,它无法找到库,因为它正在查找LD_LIBRARY_PATH中的3.4.6。如果我将LD_LIBRARY_PATH设置为4.1 lib,则会导致shell崩溃,甚至杀死其他进程,因为那些进程使用的是3.4.6库。这是一个棘手的问题。是否有办法在链接时给出共享库的绝对路径而不使用LD_LIBRARY_PATH?这样我就可以希望同时拥有两个版本,但只针对此特定应用程序使用4.1。

据我所知,这种东西并不存在,但是需要旧版本 glibc 的程序也应该可以接受新版本,因为它向后兼容。 - Ronny Brendel
版本4.0破坏了向后兼容性,我确信。 - Alex
3个回答

7
你是指程序启动时使用的绝对路径,并且在查找库时优先考虑的路径吗?rpath 就是这样。它将覆盖默认搜索路径以及设置在 LD_LIBRARY_PATH 中的内容。只需告诉 gcc 将其传递给链接器即可:
g++ -Wl,-rpath,/usr/lib/my_4.1 -omy_binary *.cpp

你可以让它显示搜索处理过程(使用help获取更多选项):
[js@HOST2 cpp]$ LD_DEBUG=libs ./a.out
  5859:     find library=libc.so.6 [0]; searching
  5859:      search path=/usr/lib/my_4.1/tls/i686/sse2:/usr/lib/my_4.1/tls/i686:
               /usr/lib/my_4.1/tls/sse2:/usr/lib/my_4.1/tls:
               /usr/lib/my_4.1/i686/sse2:/usr/lib/my_4.1/i686:
               /usr/lib/my_4.1/sse2:/usr/lib/my_4.1  (RPATH from file ./a.out)
  5859:       trying file=/usr/lib/my_4.1/tls/i686/sse2/libc.so.6
  5859:       ....
  5859:      search cache=/etc/ld.so.cache
  5859:       trying file=/lib/libc.so.6  (note: found here!)
  5859:

1

这并不是对你问题的回答,而是一个替代方案:

你应该可以通过将新库路径添加到/etc/ld.so.conf并以root身份运行ldconfig来解决你的问题。


0

你不能只为需要它的应用程序设置LD_LIBRARY_PATH吗? 也就是说,不要将其全局设置为导出变量,而是运行您的程序:

LD_LIBRARY_PATH=/path/to/4.1/libs my_executabel

?

-k


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接