2011-01-16 6 views
14

У меня есть программа, использующая LD_PRELOAD. Программа должна быть запущена как , «LD_PRELOAD =/путь/в/libfoo.so qemu -U LD_PRELOAD a.out», если без gdb.Как запустить gdb с LD_PRELOAD?

Вот что я сделал во время работы 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

ответ

7

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

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

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

Мое предположение, что /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 "[email protected]" 

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

+8

Что делает libdbo.so, пытается выполнить перед реальным __libc_start_main, извлечь данные из bzip2_base.i386-m32-gcc44-annotated, а затем перейти к реальному __libc_start_main. Оказывается, LD_PRELOAD влияет не только на qemu-i386, но и на bash, вызванный gdb. Произошла ошибка, так как bash хочет открыть файл, который он не должен (bash также зависит от LD_PRELOAD, и он выполнит __libc_start_main, предоставленный libdbo.so). Решение довольно простое. 'set exec-wrapper env 'LD_PRELOAD =/path/to/libdbo.so'' будет делать трюк. – chenwj

Смежные вопросы