Domanda
Ho un programma che utilizza LD_PRELOAD. Il programma deve essere eseguito come questo, "LD_PRELOAD = / path / to / libfoo.so qemu -U LD_PRELOAD a.out", se senza gdb.
Ecco cosa ho fatto durante l'esecuzione di 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
Ma gdb mi ha dato l'errore sotto
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.
Ogni sugguestion apprezzato.
Saluti, chenwj
Soluzione
GDB
non lo fa direttamente invoke vostro eseguibile. Invece, lo fa
bash -c '/nfs_home/chenwj/tools/bin/qemu-i386 -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1'
Questo è fatto in modo che bash si prende cura di redirezione I / O (che non si utilizza).
La mia ipotesi è che /bin/bash
non funziona quando LD_PRELOAD = libdbo.so è a tutti gli effetti, anche se non capisco l'esatta natura del fallimento.
Un modo per ovviare a questo problema è quello di creare un eseguibile involucro, attuazione C
equivalente di questo:
export LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so
exec /nfs_home/chenwj/tools/bin/qemu-i386 "$@"
ed eseguire il debug che eseguibile (senza regolazione LD_PRELOAD
). Vedrete un SIGTRAP
in più quando le execve()
s involucro del qemu-i386
avvolto, che si dovrebbe ignorare e continue
.