programing

libfoo.so .1과 같은 라이브러리 이름이 지정된 전체 파일 경로는 어떻게 찾을 수 있습니까?

yellowcard 2023. 11. 1. 22:15
반응형

libfoo.so .1과 같은 라이브러리 이름이 지정된 전체 파일 경로는 어떻게 찾을 수 있습니까?

링커를 구현하지 않거나 사용하지 않음ldd, 도서관으로 가는 모든 길을 어떻게 찾을 수 있습니까?리눅스에서 사용할 수 있는 표준 라이브러리가 있습니까? (POSIX 가능성이 있습니까?)

사용.ldd그리고.grep사용 중인 파일에libGL.so.1, 다음과 같습니다.

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

예를 들어, 도서관 이름을 지정하면 어떻게 전체 경로를 찾을있습니까?32비트 및 64비트 라이브러리 찾기 옵션을 수락하는 것이 좋습니다.만약 어떤 도서관도 그렇게 하지 않는다면, 이것을 할 수 있는 프로그램이 존재합니까?뭐 이런 거.find-library-path libGL.so.1.그locate libGL.so.1명령어가 계산되지 않습니다.

라이브러리를 실제로 로드하고 싶지 않습니다.dlopen도서관에서 코드를 실행한다면요

링크 공간을 관리하는 도구인 oldconfig를 사용합니다.

-pflag를 사용하면 링크 가능한 모든 라이브러리를 찾아볼 수 있습니다.

홍키 통크의 대답을 확대해 보면, 사령부는echo "$(ldconfig -p | grep libGL.so.1 | tr ' ' '\n' | grep /)"혼자서 길을 열어줄 겁니다

라이브러리를 실제로 로드하고 표준이 아니지만 널리 사용할 수 있는 기능을 사용하는 것이 괜찮으시다면, 전화해 주십시오.dladdr라이브러리의 모든 기호에 로드된 전체 경로 이름을 포함하는 정보가 반환됩니다.

GNU가 있는 시스템의 경우libc제가 찾은 파이썬은 다음과 같습니다.사용합니다.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)은 다음과 같습니다.

 15370: find library=libssl.so.1.0.0 [0]; searching
 15370:  search cache=/etc/ld.so.cache
 15370:   trying file=/lib/x86_64-linux-gnu/libssl.so.1.0.0
 15370: 
 15370: find library=libcrypto.so.1.0.0 [0]; searching
 15370:  search cache=/etc/ld.so.cache
 15370:   trying file=/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
 15370: 

여기에 이러한 스크립트를 구현했습니다.

#!/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()

언급URL : https://stackoverflow.com/questions/13148608/how-can-i-find-the-full-file-path-given-a-library-name-like-libfoo-so-1

반응형