문제
Gentoo를 사용하기 때문에 업데이트 프로그램이 이전 버전의 라이브러리와 연결된 후에 종종 발생합니다. 일반적으로 Revdep-Rebuild는이를 해결하는 데 도움이되지만 이번에는 파이썬 라이브러리에 대한 의존성입니다. python-updater
그것을 선택하지 않을 것입니다.
"계층 적"변형이 있습니까? ldd
공유 라이브러리가 다른 공유 라이브러리에 의존하는 것은 무엇입니까? 대부분의 시간 라이브러리 및 실행 파일은 소수의 다른 공유 라이브러리와 만 연결되어 있으며, 이는 소수의 소수와 연결되어 라이브러리 의존성을 큰 목록으로 전환했습니다. 업그레이드 한 다른 라이브러리의 새 버전으로 어떤 종속성을 재건 해야하는지 알고 싶습니다.
해결책
포티지 ≥2.2를 실행중인 경우 FEATURES=preserve-libs
, 당신은 거의 필요하지 않아야합니다 revdep-rebuild
더 이상 오래된 .so.
VERS는 필요에 따라 보존됩니다 (여전히 재건해야하지만 여전히 물건이 여전히 Kaboom이 진행되므로 libA.so.0
원한다 libC.so.0
그리고 libB.so.0
원한다 libC.so.1
그리고 일부 바이너리는 둘 다 원합니다 libA.so.0
그리고 libB.so.0
).
그것은 무엇을 말 했어요 ldd
동적 링커가 실행 파일이나 라이브러리를 일반적으로로드 할 수 있도록하는 것이지만 그 길을 따라 일부 정보를 인쇄하는 것입니다. 이것은 "이진 요구 라이브러리가 필요한 다른 라이브러리 및 hellip"검색입니다. 왜냐하면 동적 링커가하는 일이기 때문입니다.
현재 Linux/PPC32를 실행하고 있습니다. Linux/x86에서 동적 링커는 일반적으로 /lib/ld-linux.so.2
, 및 Linux/x86_64에서 동적 링커는 일반적으로 /lib/ld-linux-x86-64.so.2
. 여기서 나는 모든 것이 ldd
다이나믹 링커가 마법을 수행하기 위해 요구하는 쉘 스크립트에 지나지 않습니다.
$ /lib/ld.so.1 /sbin/badblocks Usage: /sbin/badblocks [-b block_size] [-i input_file] [-o output_file] [-svwnf] [-c blocks_at_once] [-d delay_factor_between_reads] [-e max_bad_blocks] [-p num_passes] [-t test_pattern [-t test_pattern [...]]] device [last_block [first_block]] $ LD_TRACE_LOADED_OBJECTS=1 /lib/ld.so.1 /sbin/badblocks linux-vdso32.so.1 => (0x00100000) libext2fs.so.2 => /lib/libext2fs.so.2 (0x0ffa8000) libcom_err.so.2 => /lib/libcom_err.so.2 (0x0ff84000) libc.so.6 => /lib/libc.so.6 (0x0fdfa000) libpthread.so.0 => /lib/libpthread.so.0 (0x0fdc0000) /lib/ld.so.1 (0x48000000) $ LD_TRACE_LOADED_OBJECTS=1 /lib/ld.so.1 /lib/libcom_err.so.2 linux-vdso32.so.1 => (0x00100000) libpthread.so.0 => /lib/libpthread.so.0 (0x6ffa2000) libc.so.6 => /lib/libc.so.6 (0x6fe18000) /lib/ld.so.1 (0x203ba000) $ grep -l pthread /sbin/badblocks /lib/libcom_err.so.2 /lib/libcom_err.so.2
/sbin/badblocks
나열되지 않습니다 libpthread.so.0
라이브러리 의존성으로, 그러나 libcom_err.so.2
.
당신의 문제입니다 ldd
멋진 종속성 트리를 출력하지 않습니까? 사용 ldd -v
.
$ LD_TRACE_LOADED_OBJECTS=1 LD_VERBOSE=1 /lib/ld.so.1 /sbin/badblocks linux-vdso32.so.1 => (0x00100000) libext2fs.so.2 => /lib/libext2fs.so.2 (0x0ffa8000) libcom_err.so.2 => /lib/libcom_err.so.2 (0x0ff84000) libc.so.6 => /lib/libc.so.6 (0x0fdfa000) libpthread.so.0 => /lib/libpthread.so.0 (0x0fdc0000) /lib/ld.so.1 (0x201f9000) Version information: /sbin/badblocks: libc.so.6 (GLIBC_2.2) => /lib/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/libc.so.6 libc.so.6 (GLIBC_2.1) => /lib/libc.so.6 libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 libc.so.6 (GLIBC_2.3.4) => /lib/libc.so.6 /lib/libext2fs.so.2: libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/libc.so.6 libc.so.6 (GLIBC_2.3) => /lib/libc.so.6 libc.so.6 (GLIBC_2.2) => /lib/libc.so.6 libc.so.6 (GLIBC_2.1) => /lib/libc.so.6 libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 /lib/libcom_err.so.2: ld.so.1 (GLIBC_2.3) => /lib/ld.so.1 libpthread.so.0 (GLIBC_2.1) => /lib/libpthread.so.0 libpthread.so.0 (GLIBC_2.0) => /lib/libpthread.so.0 libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/libc.so.6 libc.so.6 (GLIBC_2.1) => /lib/libc.so.6 libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 /lib/libc.so.6: ld.so.1 (GLIBC_PRIVATE) => /lib/ld.so.1 ld.so.1 (GLIBC_2.3) => /lib/ld.so.1 /lib/libpthread.so.0: ld.so.1 (GLIBC_2.3) => /lib/ld.so.1 ld.so.1 (GLIBC_2.1) => /lib/ld.so.1 ld.so.1 (GLIBC_PRIVATE) => /lib/ld.so.1 libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6 libc.so.6 (GLIBC_2.3.4) => /lib/libc.so.6 libc.so.6 (GLIBC_2.4) => /lib/libc.so.6 libc.so.6 (GLIBC_2.1) => /lib/libc.so.6 libc.so.6 (GLIBC_2.3.2) => /lib/libc.so.6 libc.so.6 (GLIBC_2.2) => /lib/libc.so.6 libc.so.6 (GLIBC_PRIVATE) => /lib/libc.so.6 libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
원한다면 동적 링커에 따라 엘프 헤더를 직접 읽을 수 있습니다.
$ readelf -d /sbin/badblocks | grep NEEDED 0x00000001 (NEEDED) Shared library: [libext2fs.so.2] 0x00000001 (NEEDED) Shared library: [libcom_err.so.2] 0x00000001 (NEEDED) Shared library: [libc.so.6] $ readelf -d /lib/libcom_err.so.2 | grep NEEDED 0x00000001 (NEEDED) Shared library: [libpthread.so.0] 0x00000001 (NEEDED) Shared library: [libc.so.6] 0x00000001 (NEEDED) Shared library: [ld.so.1]
당신은 또한 수 man ld.so
다른 귀여운 트릭은 놀 수 있습니다 glibc
동적 링커.
다른 팁
나는 많은 흥미로운 세부 사항을 보았지만 질문에 대한 직접적인 답변은 없습니다.
'계층 적'버전 ldd
~이다 lddtree
(에서 app-misc/pax-utils
):
$ lddtree /usr/bin/xmllint
xmllint => /usr/bin/xmllint (interpreter => /lib64/ld-linux-x86-64.so.2)
libreadline.so.6 => /lib64/libreadline.so.6
libncurses.so.5 => /lib64/libncurses.so.5
libdl.so.2 => /lib64/libdl.so.2
libxml2.so.2 => /usr/lib64/libxml2.so.2
libicui18n.so.49 => /usr/lib64/libicui18n.so.49
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.1/32/libstdc++.so.6
ld-linux.so.2 => /lib64/ld-linux.so.2
libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.7.1/32/libgcc_s.so.1
libicuuc.so.49 => /usr/lib64/libicuuc.so.49
libicudata.so.49 => /usr/lib64/libicudata.so.49
libz.so.1 => /lib64/libz.so.1
liblzma.so.5 => /usr/lib64/liblzma.so.5
libm.so.6 => /lib64/libm.so.6
libpthread.so.0 => /lib64/libpthread.so.0
libc.so.6 => /lib64/libc.so.6
나는 이런 것이 필요했기 때문에 썼다 tldd
, 여기에는 자체 라이브러리 종속성이 표시됩니다.
$ ./tldd ./tldd ./tldd └─libstdc++.so.6 => /lib64/libstdc++.so.6 (0x0000003687c00000) ├─libm.so.6 => /lib64/libm.so.6 (0x0000003685000000) │ └─libc.so.6 => /lib64/libc.so.6 (0x0000003684c00000) │ └─ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x0000003684400000) └─libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003686c00000)
나는 또한 "Readelf -d"를 제안하려고했지만, 당신이 아직 그렇지 않은 경우 ldflags = "-wl로 구축해야합니다. 이것은 당신 이이 문제를 덜 자주 치게 할 것입니다. Portage 2.2의 Preserve -Libs는 훌륭하지만 주로 그것을 모아서 결함이 있습니다.