【问题标题】:LD_LIBRARY_PATH : how to find a shared objectLD_LIBRARY_PATH :如何找到共享对象
【发布时间】:2010-04-07 00:21:30
【问题描述】:

我有一个共享对象 (libxyz.so)。给定 LD_LIBRARY_PATH,如何找到这个共享对象的确切位置?如果我有一个依赖于这个库的二进制文件,我会使用 ldd 。

这就是我问的原因: 我有一个 cgi 脚本,它在使用 LD_LIBRARY_PATH 设置为 VALUE1 时有效。当路径设置为 VALUE2 时,它不起作用。我想找到 VALUE1 中路径指定的库的确切位置(请注意,VALUE1 有近 20 多个不同的位置)

平台:Linux

【问题讨论】:

    标签: linux


    【解决方案1】:

    把它放在一个文件中:

    #!/bin/bash
    IFS=:
    
    for p in ${LD_LIBRARY_PATH}; do
        if [ -e ${p}/libxyz.so ]; then
            echo ${p}
        fi
    done
    

    并运行它。

    【讨论】:

    • 感谢您的回复。我只是想知道是否有一个现有的 linux 工具。另外,我注意到 lib 文件夹中的一些文件具有其他 lib 文件夹的路径名 - 所以这也需要递归查看这些目录
    • 哦,顺便说一句,如果不先使用分隔符分割路径,这将不起作用:分隔符
    • @CuriousDawg - 你是否完全按照我写的那样尝试了这个例子? IFS=: 告诉 bash 将 : 视为分隔符(或 bash 用语中的字段分隔符)。
    • 我已在 PasteBin 上将其修改后的版本粘贴为 ldfind。对于那些好奇的人,您可以在 bash 手册页中看到这一点。在线查看here,搜索“Internal Field Separator”。
    【解决方案2】:

    您也可以使用 ldd。为此,您将:

    1. 将 LD_LIBRARY_PATH 设置为工作时的值(即export LD_LIBRARY_PATH=VALUE1
    2. 运行ldd /path/to/prog | grep libxyz.so

    【讨论】:

    • 是的,我可以这样做,但这是一个 cgi 脚本,ldd 不适用于脚本
    • @CuriousDawg - 如果是脚本,在解释器上运行ldd(即#!之后的程序)
    【解决方案3】:

    睡一觉(30);在您的 cgi 中,从浏览器启动它,然后查看 /proc/$(pidof mycgi)/maps 以获取程序使用的实际库。

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 2017-10-10
      相关资源
      最近更新 更多