如果没有实现链接器或使用ldd
,我如何找到库的完整路径? Linux上有可用的标准库吗? (可能是POSIX?)
在有意使用ldd
的文件上使用grep
和libGL.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
实际加载库。
答案 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()