【问题标题】:GDB: Debug program that is started with LD_LIBRARY_PATH/LD_PRELOADGDB:以 LD_LIBRARY_PATH/LD_PRELOAD 启动的调试程序
【发布时间】:2020-09-05 10:41:55
【问题描述】:

我尝试调试以下设置。我无法使用搜索找到任何东西,所以我希望这里的人能够指导我如何执行以下操作:

我有一个正在执行的二进制文件 (./binary),还有一个在程序集级别 (./libc_patched) 操作的本地版本的 glibc。这个补丁库现在包含对自己编写的共享库 (./shared.so) 的动态调用。

所以,我现在所做的类似于:

$ LD_LIBRARY_PATH="./path/to/libc_patched:/path/to/shared" LD_PRELOAD="/path/to/libasan.so path/to/libc_patched" ./binary

现在,我的问题是 libasan 抛出了一个错误,表明 malloc 出了问题(不是 malloc()-ed 地址上的 free,或者 malloc-free 对不匹配。

二进制文件是使用标志“-g”、“-fsanitize=address”编译的,libasan 链接到二进制文件。我的 glibC 版本是 2.28,我正在全新安装 Debian10。

我现在尝试做的事情:我想使用 gdb 调试错误发生的位置。但是我找不到使用全局 libc(未打补丁)启动 gdb 的方法,而是使用打补丁的 libc 执行“待调试的二进制文件”。所以基本上如下:

$ gdb "LD_LIBRARY_PATH="./path/to/libc_patched:/path/to/shared" LD_PRELOAD="/path/to/libasan.so path/to/libc_patched" ./binary"

这样的事情可能吗?由于我修补的 libc 中有错误,我无法可靠地使用它启动 gdb。感谢您的任何提示!

【问题讨论】:

    标签: debugging gdb glibc libc


    【解决方案1】:

    answer 解释了为什么您不能使用 LD_LIBRARY_PATH 来选择不同的 GLIBC。

    最简单的解决方法是让程序使用非默认 GLIBC,而不进行环境操作。假设修补过的 GLIBC 安装在 /path/to/libc_patched 中,请像这样构建您的程序:

    gcc -Wl,--dynamic-linker=/path/to/libc_patched/lib/ld-linux-x86-64.so.2 \
      -Wl,-rpath=/path/to/libc_patched/lib main.o ...
    

    如果你不能轻松地重建二进制文件,你也可以使用

    patchelf --set-interpreter /path/to/libc_patched/lib/ld-linux-x86-64.so.2 \
      --set-rpath /path/to/libc_patched/lib ./a.out
    

    然后像这样调试它:

    gdb -ex 'set env LD_PRELOAD /path/to/libasan.so' a.out
    

    【讨论】:

    • 感谢您的提示。几个月来我一直在努力解决这个问题。明天去试试!
    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多