4

ARMオプションで呼び出すためにコンパイルされた共有オブジェクトの場合、バージョン番号なしでライブラリを表示readelfします。-alibc.so

me@home:~ $ readelf -a shared_object_for_arm | grep "Shared library"
Type:                              DYN (Shared object file)
0x00000001 (NEEDED)                     Shared library: [libc.so]
0x00000001 (NEEDED)                     Shared library: [libm.so]
0x00000001 (NEEDED)                     Shared library: [libGLESv1_CM.so]
0x00000001 (NEEDED)                     Shared library: [libz.so]
0x00000001 (NEEDED)                     Shared library: [liblog.so]

ただし、システム内の共有オブジェクトに対して同じことを繰り返すと、バージョン番号が表示されます。私もarm-linux-gnueabi-readlef上記の状況で使用しましたが、何も変わりません。私はこれをx86システムで試しています。

me@home:~ $ readelf -a /usr/lib/libsnmp.so.15 | grep "Shared library"
Type:                              DYN (Shared object file)
0x00000001 (NEEDED)                     Shared library: [libcrypto.so.1.0.0]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]

readelfバージョン番号を表示する以外の方法はありますか?

4

1 に答える 1

5

elfutilsからeu-readelfを試すこともできますが、IMHOはどちらもそこにあるものをすべてダンプします。DT_NEEDEDエントリにバージョン付きの文字列が含まれていない場合、バージョンなしです。共有オブジェクトの動的セクションには、同様のDT_SONAMEエントリが含まれています。SONAMEまたは共有オブジェクトNAMEは、共有ライブラリ(動的共有オブジェクト)の正規名の一種です。

$ readelf -d /lib64/libc.so.6 | grep SONAME
0x000000000000000e (SONAME)             Library soname: [libc.so.6]

$ readelf -d /bin/ls | grep NEEDED
...
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

特定のライブラリに対してコンパイルすると、そのDT_SONAMEエントリが、作成しているバイナリまたは共有オブジェクトのDT_NEEDEDエントリにコピーされます。実行時に、ダイナミックリンカはDT_NEEDEDエントリを使用して、その名前のファイルを検索します。AFAIKダイナミックリンカは、そのファイルのDT_SONAMEエントリをチェックしないため、理論的にはDT_SONAMEをまったく持つ必要はありません。そうでない場合は、異なる可能性があります。ターゲットシステムでlibc.soが正しいライブラリを指していることを確認するだけで済みます。libc.so.6のsymlikかもしれませんが、それは問題ではありません。

要約すると、一方のバイナリがlibc.so.6に対してリンクされ、もう一方がlibc.soに対してリンクされている場合、それらの名前の実際のファイルが同じであるか、一方が他方へのシンボリックリンクである限り、引き続き機能します。実行時に実際に何がロードされているかを確認したい場合は、lddがお友達です。

于 2012-11-26T01:53:12.403 に答える