문제

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는 훌륭하지만 주로 그것을 모아서 결함이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top