たとえば、動的にリンクされた ELF バイナリがあるとします/bin/less
。
バイナリ内には、共有ライブラリによって提供される関数への呼び出しがあります。たとえば、strcpy()
strcp
関数がどの共有ライブラリ/共有オブジェクトから取得されているかを調べるにはどうすればよいですか? つまり、func_name/shared_obj_name.so のペアを取得したいのです。
この投稿に答えて、Michael Slade は次のように書いています。
ELF ファイルは、どのシンボルがどのライブラリから来たのかを指定しません。リンク先の共有ライブラリのリストを ELF バイナリに追加し、リンカがライブラリ内のシンボルを検索できるようにするだけです。
それでも、必要な情報を (リンカを使用して) 収集する方法が必要です。私の場合、バイナリを実行して ltrace することはオプションではありません。私がこれまでに試したこと:
objdump -T /bin/less | grep strcpy
私は私に与えることを試しました:
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 strcpy
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.3.4 __strcpy_chk
これは明確ではなく、ファイルの名前も教えてくれません.so
。
実行中ldd /bin/less
、戻り:
linux-vdso.so.1 => (0x00007ffe8b7fa000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f92c23a5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92c1fe0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f92c25ec000))
「GLIBC_2.2.5」が対応していると思いますlibc.so.6
(インポートされた) 関数に対応する共有オブジェクト (.so ファイル) をプログラムで見つけるにはどうすればよいですか?