14

我有一个使用 LD_PRELOAD 的程序。如果没有 gdb,程序应该像这样运行,“LD_PRELOAD=/path/to/libfoo.so qemu -U LD_PRELOAD a.out”。

这是我在运行 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

4

1 回答 1

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 重定向(您没有使用它)。

我的猜测是,/bin/bash当 LD_PRELOAD=libdbo.so 生效时,它不起作用,尽管我不了解失败的确切性质。

解决此问题的一种方法是创建一个包装器可执行文件,实现C等效的:

export LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so
exec /nfs_home/chenwj/tools/bin/qemu-i386 "$@"

并调试该可执行文件(不设置LD_PRELOAD)。SIGTRAP当 wrapperexecve()是 Wrapped时,您会看到一个额外的qemu-i386内容,您应该忽略 and continue

于 2011-01-17T03:14:20.740 回答