如何在libfoo.so.1之类的库名下找到完整的文件路径?

时间:2012-10-30 22:38:28

标签: c linux linker

如果没有实现链接器或使用ldd,我如何找到库的完整路径? Linux上有可用的标准库吗? (可能是POSIX?)

在有意使用ldd的文件上使用greplibGL.so.1,如下所示:

$ ldd /usr/bin/glxinfo | grep libGL
libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f34ff796000)

根据libGL.so.1这样的图书馆名称,如何找到完整路径/usr/lib/libGL.so.1。最好接受查找32位和64位库的选项。如果没有库那样做,是否存在执行此操作的程序?像find-library-path libGL.so.1这样的东西。 locate libGL.so.1命令不计算在内。

如果它执行来自该库的代码,我不想使用dlopen实际加载库。

5 个答案:

答案 0 :(得分:9)

使用ldconfig这是管理链接空间的工具。

-p标志允许您浏览所有可用的可链接库。

答案 1 :(得分:3)

扩展Honky Tonk的回答,命令echo "$(ldconfig -p | grep libGL.so.1 | tr ' ' '\n' | grep /)"将为您提供单独的路径。

答案 2 :(得分:2)

如果您不介意实际加载库并使用一些非标准但广泛使用的函数,则在库中的任何符号上调用dladdr将返回包含已加载的完整路径名的信息。

答案 3 :(得分:0)

对于具有GNU print(abs(int(y1-y2))) 和Python的系统,以下是我找到的最接近的。它使用libc(在the man page of ld.so(8)中进行了描述)。

LD_DEBUG

LD_DEBUG=libs python3 -c "import ctypes; ctypes.CDLL('libssl.so.1.0.0')" 2>&1 | \ grep -A 1000 "initialize program: python" | grep -A 3 "find library" 的输出如下:

libssl.so.1.0.0

答案 4 :(得分:0)

我实现了这样一个脚本here

#!/usr/bin/env python3

"""
Like `type` but for libs.
"""

import sys
import os
from argparse import ArgumentParser
from glob import glob


def parse_ld_conf_file(fn):
    paths = []
    for l in open(fn).read().splitlines():
        l = l.strip()
        if not l:
            continue
        if l.startswith("#"):
            continue
        if l.startswith("include "):
            for sub_fn in glob(l[len("include "):]):
                paths.extend(parse_ld_conf_file(sub_fn))
            continue
        paths.append(l)
    return paths


def get_ld_paths():
    # To be very correct, see man-page of ld.so.
    # And here: http://unix.stackexchange.com/questions/354295/what-is-the-default-value-of-ld-library-path/354296
    # Short version, not specific to an executable, in this order:
    # - LD_LIBRARY_PATH
    # - /etc/ld.so.cache (instead we will parse /etc/ld.so.conf)
    # - /lib, /usr/lib (or maybe /lib64, /usr/lib64)
    paths = []
    if "LD_LIBRARY_PATH" in os.environ:
        paths.extend(os.environ["LD_LIBRARY_PATH"].split(":"))
    paths.extend(parse_ld_conf_file("/etc/ld.so.conf"))
    paths.extend(["/lib", "/usr/lib", "/lib64", "/usr/lib64"])
    return paths


def main():
    arg_parser = ArgumentParser()
    arg_parser.add_argument("lib")
    args = arg_parser.parse_args()

    paths = get_ld_paths()
    for p in paths:
        fn = "%s/%s" % (p, args.lib)
        if os.path.exists(fn):
            print(fn)
            return

    print("Did not found %r in %r." % (args.lib, paths), file=sys.stderr)
    sys.exit(1)


if __name__ == "__main__":
    main()