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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top