【问题标题】:How to run gdb with LD_PRELOAD?如何使用 LD_PRELOAD 运行 gdb?
【发布时间】:2011-06-09 21:06:39
【问题描述】:

我有一个使用 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.

任何建议表示赞赏。

问候,陈wj

【问题讨论】:

    标签: gdb qemu


    【解决方案1】:

    GDB 不会直接调用您的可执行文件。相反,它确实

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

    这样做是为了让 bash 处理 I/O 重定向(您没有使用它)。

    我的猜测是,当 LD_PRELOAD=libdbo.so 生效时,/bin/bash 不起作用,尽管我不了解失败的确切性质。

    解决此问题的一种方法是创建一个包装器可执行文件,实现 C 等效于:

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

    并调试该可执行文件(不设置LD_PRELOAD)。当包装器execve()s 包装了qemu-i386 时,你会看到一个额外的SIGTRAP,你应该忽略它和continue

    【讨论】:

    • libdbo.so 所做的是尝试在真正的 __libc_start_main 之前执行,从 bzip2_base.i386-m32-gcc44-annotated 中检索数据,然后传递给真正的 __libc_start_main。事实证明,LD_PRELOAD 不仅会影响 qemu-i386,还会影响 gdb 调用的 bash。发生错误是因为 bash 想要打开一些它不应该打开的文件(bash 也受 LD_PRELOAD 影响,它会执行 libdbo.so 提供的 __libc_start_main)。解决方案非常简单。 set exec-wrapper env 'LD_PRELOAD=/path/to/libdbo.so' 会成功的。
    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 2015-01-17
    • 2022-11-11
    • 1970-01-01
    • 2012-03-02
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多