Pregunta
Tengo un programa usando LD_PRELOAD. El programa debe ejecutarse como esto "LD_PRELOAD = / ruta / a / libfoo.so qemu -U LD_PRELOAD a.out", si sin BGF.
Aquí hay lo que hice mientras se ejecuta 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
Pero GDB me dio el error abajo
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.
Cualquier sugguestion apreciado.
Saludos, chenwj
Solución
GDB
no lo hace directamente invocar el ejecutable. En su lugar, lo hace
bash -c '/nfs_home/chenwj/tools/bin/qemu-i386 -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1'
Esto se hace para que fiesta se encarga de E / S de cambio de dirección (que no está utilizando).
Mi conjetura es que /bin/bash
no funciona cuando LD_PRELOAD = libdbo.so es, en efecto, aunque no entiendo la naturaleza exacta del fallo.
Una forma de evitar este problema es crear un ejecutable de envoltura, la implementación de C
equivalente de esto:
export LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so
exec /nfs_home/chenwj/tools/bin/qemu-i386 "$@"
y depurar ese ejecutable (sin LD_PRELOAD
ajuste). Verá un SIGTRAP
extra cuando los execve()
s envoltura del qemu-i386
envuelto, que debe ignorar y continue
.