ライブラリが見つからない場合、ldd に対応する操作は失敗します。

ライブラリが見つからない場合、ldd に対応する操作は失敗します。

ldd /bin/lspthreadライブラリを削除した状態でこれを行うとしましょう。私は得る

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

lddbashLinuxでは注意してください。少なくとも以前のシステムでは、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で終了し、コマンドラインスイッチや環境変数を介して変更することはできません。ソースコードを変更する必要があります。

おすすめ記事