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
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