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를 사용합니다.
그-p
flag를 사용하면 링크 가능한 모든 라이브러리를 찾아볼 수 있습니다.
홍키 통크의 대답을 확대해 보면, 사령부는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
'programing' 카테고리의 다른 글
LISTAGG 윈도잉 절과 동등함 (0) | 2023.11.01 |
---|---|
한 사용자가 수정한 모든 파일을 알려줄 수 있습니까? (0) | 2023.11.01 |
날짜 시간을 지원하는 파이썬 JSON 인코더? (0) | 2023.11.01 |
기준과 일치하는 가장 최근 타임스탬프가 있는 행을 선택하는 가장 좋은 방법 (0) | 2023.11.01 |
압축-archive 및 상대 경로 보존 (0) | 2023.11.01 |