Frage
habe ich ein Programm mit LD_PRELOAD. Das Programm sollte wie ausgeführt werden diese "LD_PRELOAD = / path / to / libfoo.so qemu -U LD_PRELOAD a.out", wenn ohne gdb.
Hier sind, was ich tat, während gdb läuft.
(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
Aber gdb gab mir den Fehler unter
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.
Jede sugguestion geschätzt.
Regards, chenwj
Lösung
GDB
nicht invoke ausführbare Datei direkt. Stattdessen es funktioniert
bash -c '/nfs_home/chenwj/tools/bin/qemu-i386 -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1'
Dies geschieht so, dass bash Pflege I nimmt / O-Umleitung (die Sie nicht verwenden).
Meine Vermutung ist, dass /bin/bash
funktioniert nicht, wenn LD_PRELOAD = libdbo.so in Kraft ist, wenn ich die genaue Art des Scheiterns nicht verstehen.
Ein Weg, um dieses Problem zu umgehen ist eine Wrapper ausführbar zu erstellen, Implementierung C
äquivalent folgt aus:
export LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so
exec /nfs_home/chenwj/tools/bin/qemu-i386 "$@"
und debuggen, dass ausführbare Datei (ohne Einstellung LD_PRELOAD
). Sie erhalten eine zusätzliche SIGTRAP
sehen, wenn die Wrapper execve()
s der umhüllte qemu-i386
, die Sie ignorieren sollten und continue
.