我想我理解为什么在加载一个加载了libcl.2的单线程库的多线程应用程序时需要LD_PRELOAD set但是我想知道是否可以使用一些链接器设置来避免这种情况。任何帮助表示赞赏。
更新
Perl加载 动态/usr/lib/libc.2 Perl加载DB2.sl DB2尝试加载 动态/usr/lib/libcl.2
可能是事实已经加载了具有该共享对象名称的内容然后失败。
/ usr / lib> pwd
/ usr / lib
/ usr / lib> ls -lt | grep libcl.2
-r-xr-xr-x 1 bin bin 1261568 Feb 14 2003 libcl.2
lrwxr-xr-x 1 root sys 2002年11月21日libcl.sl - > ./libcl.2
现在拒绝寻找这个名字的原因可能是由chattr输出解释的:
两者都设置了禁用字段,因此它们不会查看环境,也不会使用备用名称
chal on perl perl的:
shared executable shared library dynamic path search: SHLIB_PATH disabled second embedded path disabled first Not Defined shared library list: dynamic /usr/lib/libnsl.1 dynamic /usr/lib/libnm.sl dynamic /usr/lib/libdld.2 dynamic /usr/lib/libm.2 dynamic /usr/lib/libsec.2 dynamic /usr/lib/libpthread.1 dynamic /usr/lib/libc.2
关于DB2.sl的问题 DB2.sl:
shared library shared library dynamic path search: SHLIB_PATH disabled second embedded path disabled first Not Defined shared library list: dynamic /opt/IBM/db2/V8.1/lib/libdb2.sl dynamic /usr/lib/libcl.2
可能会调整其中一个库的chatr设置吗?
更新:为什么不让他们使用相同的名称。
答案 0 :(得分:1)
根据您的编译器/链接器(考虑到我十多年前登录的HPUX机器让我感到不寒而栗),--rpath
可能有所帮助:据我所知,在您的情况下,rtld正在寻找错误的地方首先,所以这就是为什么你要预加载一些其他版本的lib,对吧?在这种情况下,rpath会在编译的二进制文件中嵌入一个额外的搜索位置,您可以使用该位置将其指向您首选版本所在的目录。
希望这会有所帮助。 -V
答案 1 :(得分:1)
我在HP-UX上写了一篇关于共享库的article,并尝试使其清晰而全面。我发现自己必须调试为什么程序找不到它们的库,所以我记录了它。
影响库搜索的三个主要位置是1)/ etc / SHLIBPATH; 2)环境变量; 3)嵌入式库搜索路径。
不幸的是,这是一个严重的过度简化:我提供的最佳参考是将所有内容整合在一起的文章(在我看来,无论如何)。
答案 2 :(得分:0)
没有链接器标志可以避免这种情况。