2011-01-16 18 views
14

Tôi có một chương trình sử dụng LD_PRELOAD. Chương trình sẽ chạy như điều này, "LD_PRELOAD =/path/to/libfoo.so qemu -U LD_PRELOAD a.out", nếu không có gdb.Làm thế nào để chạy gdb với LD_PRELOAD?

Dưới đây là những gì tôi đã làm khi chạy 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

Nhưng gdb đã cho tôi lỗi dưới đây

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.

Bất kỳ đề xuất nào được đánh giá cao.

Trân trọng, chenwj

Trả lời

7

GDB không gọi trực tiếp tệp thi hành của bạn. Thay vào đó, nó thực hiện

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

Điều này được thực hiện để bash chăm sóc chuyển hướng I/O (mà bạn không sử dụng).

Tôi đoán là /bin/bash không hoạt động khi LD_PRELOAD = libdbo.so có hiệu lực, mặc dù tôi không hiểu bản chất chính xác của lỗi.

Một cách để làm việc xung quanh vấn đề này là tạo ra một wrapper thực thi, triển khai C tương đương này:

export LD_PRELOAD=/nfs_home/chenwj/tools/lib/libdbo.so 
exec /nfs_home/chenwj/tools/bin/qemu-i386 "[email protected]" 

và gỡ lỗi mà thực thi (không có thiết LD_PRELOAD). Bạn sẽ thấy thêm SIGTRAP khi trình bao bọc execve() s được gói qemu-i386, bạn nên bỏ qua và continue.

+8

Điều gì libdbo.so làm là cố gắng thực thi trước __libc_start_main thực, truy xuất dữ liệu từ chú thích bzip2_base.i386-m32-gcc44, sau đó chuyển đến __libc_start_main thực. Nó chỉ ra rằng LD_PRELOAD không chỉ ảnh hưởng đến qemu-i386 mà còn là bash được gọi bởi gdb. Lỗi xảy ra kể từ khi bash muốn mở một số tập tin mà nó không nên (bash cũng bị ảnh hưởng bởi LD_PRELOAD, và nó sẽ thực hiện __libc_start_main được cung cấp bởi libdbo.so). Giải pháp khá đơn giản. 'set exec-wrapper env 'LD_PRELOAD =/path/to/libdbo.so'' sẽ thực hiện thủ thuật. – chenwj

Các vấn đề liên quan