web-dev-qa-db-ja.com

階層型ldd(1)

Gentooを使用しているため、更新プログラムがライブラリの古いバージョンに対してリンクされていることがよくあります。通常、revdep-rebuildはそれを解決するのに役立ちますが、今回はpythonライブラリへの依存関係であり、python-updaterはそれを取得しません。

lddの「階層的」バリアントはありますか?これは、どの共有ライブラリがどの別の共有ライブラリに依存しているかを示していますか?ほとんどの場合、ライブラリと実行可能ファイルは、他の少数の共有ライブラリに対してのみリンクされており、共有ライブラリは少数に対してリンクされているため、ライブラリの依存関係が大きなリストになっています。アップグレードした別のライブラリの新しいバージョンで再構築する必要がある依存関係を知りたいです。

39
Astro

Portage≥2.2をFEATURES=preserve-libsで実行している場合、古いrevdep-rebuildversが必要に応じて保持されるため、もう.so.が必要になることはめったにありません(ただし、引き続き問題が発生するため、慎重に再構築する必要があります) libA.so.0libC.so.0を必要とし、libB.so.0libC.so.1を必要とし、一部のバイナリがlibA.so.0libB.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のダイナミックリンカーで遊ぶことができる他のかわいいトリックもできます。

20
ephemient

興味深い詳細はたくさんありますが、質問に対する直接の回答はありません。

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
78
Michał Górny

私はこのようなものが必要だったので、私は 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)
10
Jonathan Wakely