特定実行ファイルがどの共有ファイルをリンクしているかは以下のコマンドで知ることができる。
LD_TRACE_LOADED_OBJECTS=1 <コマンド名>
例えば ls なら以下の通り。
$ LD_TRACE_LOADED_OBJECTS=1 /bin/ls
linux-vdso.so.1 (0x00007ffee9a70000)
libselinux.so.1 => /lib/aarch64-linux-gnu/libselinux.so.1 (0x00007ffee99d0000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x00007ffee9810000)
/lib/ld-linux-aarch64.so.1 (0x00007ffee9a38000)
libpcre2-8.so.0 => /lib/aarch64-linux-gnu/libpcre2-8.so.0 (0x00007ffee9760000)
プログラムで記述する場合は execl を使うと良いようだ。execve を使うとプログラムを起動してしまうので、注意しなければならない。結果は標準出力に出される。
なお、この取得方法は exec 系関数を使うので危険という指摘もある。
ELF を解析して .dynamic セクションの DT_NEEDED を拾えば必要な共有ライブラリ名が取得できる(objdump -p <ファイル名> | grep NEEDED としても同等の結果が得らえる)。ただしどのフォルダの共有ファイルと結合しているかという情報はないので、ldconfig キャッシュ等から自分で追跡する必要がある。今回は時間切れとなってしまったが、時間が出来たら「安全」な共有ライブラリ情報出力コマンドを作るつもり。
コメントを残す