我想我明白为什么我需要 LD_PRELOAD set当加载一个多线程应用程序加载一个加载 libcl.2 的单线程库时,但我想知道我是否可以使用一些链接器设置来避免这种情况。任何帮助表示赞赏。
更新:
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 9 Nov 21 2002 libcl.sl -> ./libcl.2
现在拒绝去寻找同名的东西的原因可能由 chattr 输出解释:
两者都设置了禁用字段,因此它们不会在环境中查找,也不会使用备用名称
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 上的 chatr 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 设置?
更新:为什么不让他们对库使用相同的名称。
最佳答案
根据您的编译器/链接器(想想我十多年前登录的 HPUX 机器让我不寒而栗),--rpath
可能会有所帮助:据我了解,在您的情况下rtld 首先在错误的地方寻找,所以这就是为什么你想预加载其他版本的库,对吧?在这种情况下,rpath 会将一个额外的搜索位置嵌入到已编译的二进制文件中,您可以使用该位置将其指向首选版本所在的目录。
希望这对您有所帮助。 -V
关于c - 有什么方法可以更改链接以避免 HPUX 上的 LD_PRELOAD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/782124/