如何使用LD_PRELOAD运行gdb?

che*_*nwj 14 gdb qemu

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

Emp*_*ian 7

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.

  • 什么libdbo.so做的就是尽量真实__libc_start_main之前执行,从bzip2_base.i386-M32-gcc44标注检索数据,然后传给真正__libc_start_main.事实证明,LD_PRELOAD不仅影响qemu-i386,还影响gdb调用的bash.错误发生,因为庆典想打开某些文件,它不应该(bash中也受LD_PRELOAD,它会执行由libdbo.so提供的__libc_start_main).解决方案非常简单.`set exec-wrapper env'LD_PRELOAD =/path/to/libdbo.so'`就可以了. (8认同)