경로가 주어지면 이를 사용하기 위해 설치해야 하는 모든 운영 체제 패키지를 검색하고 싶습니다. 예를 들어:
> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/bin/tcsh
tcsh
때로는 작동하지 않습니다. 예를 들어:
> /bin/rpm -qf --queryformat "[%{NAME}]\n" /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
file /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so is not owned by any package
그러나 출력을 보면 다음과 같습니다 ldd
.
> ldd /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
linux-vdso.so.1 (0x00007f11f7ffa000)
libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x0000711fff7901000)
libpython3.7m.so.1.0 => /usr/pkgs/python3/3.7.4/lib/libpython3.7m.so.1.0 (0x00007ffff7422000)
libpthread.so.0 => /lib64/noelision/libpthread.so.0 (0x00007f11ff7205000)
libc.so.6 => /lib64/libc.so.6 (0x00007f13ff6e60000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ff126c5c000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007ff216a21000)
libutil.so.1 => /lib64/libutil.so.1 (0x0000711ff681e000)
libm.so.6 => /lib64/libm.so.6 (0x00007fff16521000)
/lib64/ld-linux-x86-64.so.2 (0x00007fff17ddb000)
나는 그것이 /usr/lib64/libsqlite3.so.0
. 그래서 나는 이것을 할 수 있습니다 :
> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/lib64/libsqlite3.so.0
libsqlite3-0
이는 사용하기 전에 설치해야 하는 필수 운영 체제 패키지가 있음을 의미합니다 /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
.
이제 위 rpm
명령을 실행한 다음 ldd
각 경로에서 해당 명령을 실행하고 공유 라이브러리를 반복하는 스크립트를 만들 수 있습니다( locate
for와 같은 경로가 없는 경우가 있기 때문에 필요할 수 있음 linux-vdso.so.1
). 하지만:
- 사용을 권장하지 않습니다
ldd
. - 출력 구문 분석은
ldd
매우 추악합니다.
지금 관련글을 봤는데주제이 문제에서는. 사용할 수 있지만 readelf
동일한 문제가 있습니다.
특정 경로에 필요한 모든 운영 체제 패키지를 검색하는 더 나은 솔루션이 있습니까? 나도 사용하고 있어요rpmdep.pl그러나 패키지 이름을 가져오고 모든 패키지 종속성을 반환할 것으로 예상됩니다. 이제 내 알고리즘은 다음과 같습니다.
- 실행하여
/bin/rpm -qf --queryformat "[%{NAME}]\n" $path
패키지 이름($package)
.으로 표시)을 가져와서 패키지 목록에 추가합니다. - )을 실행
rpmdep.pl $package
하고 모든 패키지를 목록에 추가합니다. ldd $path
각 행의 합계를 실행합니다.- 경로가 존재하는 경우(예:
libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0
) 1단계로 돌아가십시오/usr/lib64/libsqlite3.so.0
. - 경로가 없으면(예 : 명령을
linux-vdso.so.1
사용하여) 경로를 찾아보고locate
, 찾은 경우 얻은 경로를 사용하여 1단계로 돌아갑니다.
- 경로가 존재하는 경우(예:
이렇게 하면 경로에 필요한 모든 OS 패키지를 수집할 수 있습니다. 잘 작동하지만 이 작업을 해결하기 위한 더 좋고 깨끗한 방법을 찾고 있습니다. 또한, 제가 제안한 알고리즘에 대해 어떻게 생각하시나요?
그것이 중요하다면 OpenSUSE를 사용하고 있습니다.