使用RPATH指向libc库
我需要在古老的linux发行版(CentOS 6.5)中部署我的共享库(.so)。
问题是我实际上使用CentOS 7编译我的代码(gcc 4.8.2),而libc版本不同。
我的代码取决于GLIBC 2.14,然而,CentOS 6.5中最新的GLIBC版本是2.13。
我想使用RPATH机制并将libc文件与共享库文件(.so)一起部署。
这甚至有可能吗?
到目前为止,我做了什么
我创建了一个目录,其中包含:
$ ls ld-linux-x86-64.so.2 libc.so.6 libgcc_s.so.1 libm.so.6 libstdc++.so.6
-static-libgcc和-static-libstdc ++
这些帮助解决了GLIBCXX的问题。 但是,GLIBC版本问题仍然存在:
/lib64/libc.so.6: version `GLIBC_2.14' not found (required by sss_reactions/libsss_reactions.so)
--rpath和--dynamic-linker
使用readelf
实用程序,我看到RPATH已正确设置,并且在库上调用ldd
也指向正确的目录(包含较新的libc)。
但是,当我尝试使用dlopen()
加载库时,出现同样的错误:
/lib64/libc.so.6: version `GLIBC_2.14' not found (required by sss_reactions/libsss_reactions.so)
设置LD_LIBRARY_PATH
在这种情况下,我得到这个错误:
$ LD_LIBRARY_PATH=../dist/ ./Dlopen ./Dlopen: relocation error: ../dist/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
我想使用RPATH机制并将libc文件与共享库文件(.so)一起部署。
这甚至有可能吗?
不,这不是,这里解释的原因。
另请参阅此答案,了解在单个主机上共存多个libc.so.6
实例的过程。