Gentooを使用しているため、更新プログラムがライブラリの古いバージョンに対してリンクされていることがよくあります。通常、revdep-rebuildはそれを解決するのに役立ちますが、今回はpythonライブラリへの依存関係であり、python-updater
はそれを取得しません。
ldd
の「階層的」バリアントはありますか?これは、どの共有ライブラリがどの別の共有ライブラリに依存しているかを示していますか?ほとんどの場合、ライブラリと実行可能ファイルは、他の少数の共有ライブラリに対してのみリンクされており、共有ライブラリは少数に対してリンクされているため、ライブラリの依存関係が大きなリストになっています。アップグレードした別のライブラリの新しいバージョンで再構築する必要がある依存関係を知りたいです。
Portage≥2.2をFEATURES=preserve-libs
で実行している場合、古いrevdep-rebuild
versが必要に応じて保持されるため、もう.so.
が必要になることはめったにありません(ただし、引き続き問題が発生するため、慎重に再構築する必要があります) libA.so.0
がlibC.so.0
を必要とし、libB.so.0
がlibC.so.1
を必要とし、一部のバイナリがlibA.so.0
とlibB.so.0
の両方を必要とする場合のkaboom。
そうは言っても、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 使用方法:/ 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 [...]] デバイス[ 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) バージョン情報: /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
必要に応じて、動的リンカーに依存する代わりに、ELFヘッダーを直接読み取ることができます。
$ readelf -d/sbin/badblocks | grep NEEDED 0x00000001(NEEDED)共有ライブラリ:[libext2fs.so.2] 0x00000001(NEEDED)共有ライブラリ:[libcom_err.so.2] 0x00000001(NEEDED)共有ライブラリ:[libc.so.6] $ readelf -d /lib/libcom_err.so.2 | grep NEEDED 0x00000001(NEEDED)共有ライブラリ:[libpthread.so.0] 0x00000001(NEEDED)共有ライブラリ:[libc.so.6] 0x00000001(NEEDED)共有ライブラリ:[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)