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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top