2011-01-16 18 views
14

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 non gdb.Come eseguire gdb con LD_PRELOAD?

Ecco quello che 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.

Qualunque sugguestion apprezzato.

saluti, chenwj

risposta

7

GDB non richiamare direttamente l'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 viene fatto in modo che bash si prende cura di redirezione I/O (che non si utilizza).

La mia ipotesi è che /bin/bash non funzioni quando LD_PRELOAD = libdbo.so è in effetti, anche se non capisco la natura esatta dell'errore.

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 "[email protected]" 

ed eseguire il debug che eseguibile (senza impostare LD_PRELOAD). Vedrete un extra SIGTRAP quando l'involucro execve() s il avvolto qemu-i386, che si dovrebbe ignorare e continue.

+8

Ciò che libdbo.so fa è provare ad essere eseguito prima del __libc_start_main reale, recuperare i dati dal bzip2_base.i386-m32-gcc44-annotato, quindi passare al __libc_start_main reale. Si scopre che LD_PRELOAD non riguarda solo qemu-i386 ma anche il bash invocato da gdb. L'errore si è verificato dal momento che bash desidera aprire alcuni file che non dovrebbe (bash è anche influenzato da LD_PRELOAD, ed eseguirà il __libc_start_main fornito da libdbo.so). La soluzione è abbastanza semplice. 'set exec-wrapper env 'LD_PRELOAD =/percorso/a/libdbo.so'' farà il trucco. – chenwj