我有一个使用 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.
任何建议表示赞赏。
问候,陈维杰
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
当包装纸execve()
是包裹的qemu-i386
,你应该忽略它并且continue
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)