我有一个使用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
答案 0 :(得分:7)
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重定向(你没有使用)。
我的猜测是,当{LDO-PRELOAD = libdbo.so生效时/bin/bash
不起作用,但我不了解失败的确切性质。
解决此问题的一种方法是创建一个包装器可执行文件,实现相当于此的C
:
export LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so
exec /nfs_home/chenwj/tools/bin/qemu-i386 "$@"
并调试该可执行文件(不设置LD_PRELOAD
)。当包装SIGTRAP
包装execve()
时,您会看到额外的qemu-i386
,您应该忽略它continue
。