ldd /bin/ls
pthreadライブラリを削除した状態でこれを行うとしましょう。私は得る
linux-vdso.so.1 (0x00007ffcc3563000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f87e5459000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f87e5254000)
libc.so.6 => /lib64/libc.so.6 (0x00007f87e4e92000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f87e4c22000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f87e4a1e000)
/lib64/ld-linux-x86-64.so.2 (0x00005574bf12e000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f87e4817000)
libpthread.so.0 => not found
戻りコードは0です。この場合、エラーを返すコマンドはありますか?似たようなもの
#!/bin/bash
if [[ ! -z $(ldd ${target} | grep 'not found') ]]; then
exit 1
fi
答え1
ldd
bash
Linuxでは注意してください。少なくとも以前のシステムでは、LD_TRACE_LOADED_OBJECTS=1
その環境で特定のプログラムを実行するスクリプトにすぎません。
つまり、プログラムに実行中のインタプリタ以外のインタプリタがある場合、プログラムは意図しない場合でもターゲットを/lib{64,32}/ld-*
最初の引数として使用します。ldd
他のユーザーが所有する実行可能ファイルから実行すると、そのユーザーはあなた代わりに。
を使用して、ELFヘッダーで定義されているインタプリタを確認できますreadelf -l "$target" | grep interpreter
。
最新のシステムでは、ldd
「良い」インタプリタのリストから取得したインタプリタにターゲットをパラメータとして渡すように変更されました(例/lib64/ld-linux.so.2 target
:)。これは説得力があるとは思えませんが、十分に安全であるかどうかはユーザーに依存します。決める
これらすべてが受け入れ可能な場合、最も簡単な方法は次のとおりです。
if ldd "$target" | grep -q 'not found'; then
echo >&2 "$target is missing dependencies"
exit 1
fi
Linuxのデフォルトの動的ローダは、「トレースモード」(lddなど)で呼び出されると常にステータス0で終了し、コマンドラインスイッチや環境変数を介して変更することはできません。ソースコードを変更する必要があります。