Вопрос

У меня есть программа с использованием ld_preload. Программа следует запустить так: «LD_PRELOAD =/path/to/libfoo.so qemu -u ld_preload a.out», если без GDB.

Вот что я сделал во время управления 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

Но GDB дал мне ошибку ниже

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.

Любое предложение оценивается.

С уважением, Chenwj

Это было полезно?

Решение

GDB не призывает вашего исполняемого файла напрямую. Вместо этого это делает

bash -c '/nfs_home/chenwj/tools/bin/qemu-i386  -U LD_PRELOAD bzip2_base.i386-m32-gcc44-annotated input.source 1'

Это сделано для того, чтобы Bash позаботился о перенаправлении ввода/вывода (которое вы не используете).

Я предполагаю, что это /bin/bash не работает, когда LD_PRELOAD = libdbo.so действует, хотя я не понимаю точной природы неудачи.

Один из способов обойти эту проблему - создать исполняемый файл обертки, реализовывать C эквивалент этого:

export LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so
exec /nfs_home/chenwj/tools/bin/qemu-i386 "$@"

и отладка этого исполняемого (без настройки LD_PRELOAD) Вы увидите дополнительное SIGTRAP Когда обертка execve()S завернут qemu-i386, что вы должны игнорировать и continue.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top