ldd命令在某个任意位置搜索libs

时间:2010-10-05 14:55:16

标签: c shared-libraries

我在可执行文件上运行了truss命令并得到以下输出:

stat64(“/ net / xyzmachine / vol / tools / solx64 / studio11 / SUNWspro / lib / rw7 / librt.so.1”,0x080474A0)(睡觉......) stat64(“/ net / xyzmachine / vol / tools / solx64 / studio11 / SUNWspro / lib / rw7 / librt.so.1”,0x080474A0)Err#2 ENOENT stat64(“/ net / xyzmachine / vol / tools / solx64 / studio11 / SUNWspro / lib / librt.so.1”,0x080474A0)(睡觉......)

我查看了构建日志和buildhost的Envs,但LD_LIB_PATH,LIBPATH,LD_RUN_PATH值未指向此位置。我无法从这个价值来的地方得到它?

任何人都可以帮助我理解这个吗? lib搜索路径如何决定?如何排除故障?

4 个答案:

答案 0 :(得分:1)

这个库可能是某些应用程序依赖项的依赖项。 ldd以递归方式打印应用程序或其依赖项所依赖的所有共享库。

它在/etc/ld.so.conf(/etc/ld.so.conf.d/)或LD_LIBRARY_PATH中描述的路径中搜索库。

请注意,也可以在共享库本身中设置rpath

此处有更多信息:Program-Library-HOWTO

答案 1 :(得分:0)

用于创建可执行文件的链接器可能直接在可执行文件中硬编码了一些路径。 大多数链接器默认执行此操作,并允许在命令行上指定选项以添加特定的其他路径以查看.so库。

答案 2 :(得分:0)

看起来您可能在可执行文件中设置了rpath。尝试:

chrpath /path/to/binary

看看是否会打印出你从ldd获得的路径。要删除rpath并使用标准系统库,请使用:

chrpath -d /path/to/executable

答案 3 :(得分:0)

谢谢你们的帮助。我发现了这个问题。有人删除了/ opt / studio11目录,并链接到/ net / xyzmachine / vol / tools / solx64 / studio11。因此在编译期间它显示为/ opt / studio11 / ....但在地图文件中它保留“net / xyzmachine / vol / tools / solx64 / studio11”值。

再次感谢您的帮助。