c - 有什么方法可以更改链接以避免 HPUX 上的 LD_PRELOAD?

标签 c multithreading linker

我想我明白为什么我需要 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/

相关文章:

linux - pthread_mutex_unlock 立即上下文切换吗?

java - 如何终止从 ExecutorService 生成的线程

c++ - "error LNK2001: unresolved external symbol"

dll - 与 ffmpeg 共享构建链接

c - 打印序列中出现次数最多的数字

c - 初始化使指针来自整数,而没有强制转换[默认启用]C 中的错误

Java:如何强制杀死不需要的线程?

ios - LinkedIn SDK 的位码错误

c - syntastic 叛变 : how to disable checking files in/usr/include/*. h

c - C 预处理器如何处理循环依赖?