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

时间:2009-04-23 14:54:33

标签: c multithreading linker

我想我理解为什么在加载一个加载了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设置吗?

更新:为什么不让他们使用相同的名称。

3 个答案:

答案 0 :(得分:1)

根据您的编译器/链接器(考虑到我十多年前登录的HPUX机器让我感到不寒而栗),--rpath可能有所帮助:据我所知,在您的情况下,rtld正在寻找错误的地方首先,所以这就是为什么你要预加载一些其他版本的lib,对吧?在这种情况下,rpath会在编译的二进制文件中嵌入一个额外的搜索位置,您可以使用该位置将其指向您首选版本所在的目录。

希望这会有所帮助。 -V

答案 1 :(得分:1)

我在HP-UX上写了一篇关于共享库的article,并尝试使其清晰而全面。我发现自己必须调试为什么程序找不到它们的库,所以我记录了它。

影响库搜索的三个主要位置是1)/ etc / SHLIBPATH; 2)环境变量; 3)嵌入式库搜索路径。

不幸的是,这是一个严重的过度简化:我提供的最佳参考是将所有内容整合在一起的文章(在我看来,无论如何)。

答案 2 :(得分:0)

没有链接器标志可以避免这种情况。