如何使用LD_PRELOAD运行gdb?

时间:2011-01-16 04:17:02

标签: gdb qemu

我有一个使用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

1 个答案:

答案 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