我有一个使用ld_preload的程序。如果没有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.

任何建议都赞赏。

问候,钦威

有帮助吗?

解决方案

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。

解决此问题的一种方法是创建包装器可执行文件,实施 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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top