我有一个使用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
GDB不会直接调用您的可执行文件.相反,它确实如此
bash -c '/nfs_home/chenwj/tools/bin/qemu-i386 -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1'
Run Code Online (Sandbox Code Playgroud)
这样做是为了让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 "$@"
Run Code Online (Sandbox Code Playgroud)
并调试该可执行文件(无需设置LD_PRELOAD).SIGTRAP当包装好的execve()包裹时你会看到一个额外的东西qemu-i386,你应该忽略它continue.