質問
LD_PRELOADを使用したプログラムがあります。このプログラムは、このように実行する必要があります。「ld_preload =/path/to/libfoo.so qemu -u ld_preload a.out」、gdbがない場合。
GDBを実行しているときに私がしたことは次のとおりです。
(gdb) set environment LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so
(gdb) file /nfs_home/chenwj/tools/bin/qemu-i386
(gdb) r -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1
しかし、GDBは以下のエラーを与えてくれました
Starting program: /nfs_home/chenwj/tools/bin/qemu-i386 -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1
bash: open "/bin/bash" failed: Permission denied
During startup program exited with code 66.
あらゆる提案が高く評価されました。
よろしく、chenwj
解決
GDB
実行可能ファイルを直接呼び出しません。代わりに、そうです
bash -c '/nfs_home/chenwj/tools/bin/qemu-i386 -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1'
これは、BashがI/Oリダイレクト(使用していない)の世話をするように行われます。
私の推測はそれです /bin/bash
ld_preload = libdbo.soが有効になっている場合は機能しませんが、障害の正確な性質はわかりません。
この問題を回避する1つの方法は、ラッパー実行可能ファイルを作成し、実装することです C
これに相当します:
export LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so
exec /nfs_home/chenwj/tools/bin/qemu-i386 "$@"
その実行可能ファイルをデバッグします(設定なし LD_PRELOAD
)。余分なものが表示されます SIGTRAP
ラッパーのとき execve()
sラップ qemu-i386
, 、それを無視する必要があります continue
.