【问题标题】:Use a custom dynamic linker with gdb使用带有 gdb 的自定义动态链接器
【发布时间】:2021-09-20 07:10:01
【问题描述】:

我已经构建了一个自定义版本的 glibc。它引入了一些我在自定义共享库中使用的新符号。为此,我添加了一个新版本:SHIM

我使用gcc -g -o my_test my_test.c -l my_so.so -Wl,-dynamic-linker=/local/home/me/glibc-build/ld-linux-x86-64.so.2 来构建一个测试可执行文件。它需要使用我的自定义 glibc 构建的运行时链接器,以便它可以链接 my_so.so 中使用的自定义 glibc 符号。这确实有效。

但是当我使用gdb调试可执行文件时,我发现使用了默认的运行时链接器。我收到以下错误:

/bin/bash: /lib64/ld-linux-x86-64.so.2: 找不到版本“SHIM”(/local/home/me/glibc-build/libc.so.6 需要)

如何让 gdb 使用我的自定义运行时链接器?我尝试使用gdb --args /local/home/me/glibc-build/ld-linux-x86-64.so.2 ./my_test,但我最终得到了同样的错误

【问题讨论】:

    标签: c linux gdb glibc


    【解决方案1】:

    我使用gcc -g -o my_test my_test.c -l my_so.so -Wl,-dynamic-linker=/local/home/me/glibc-build/ld-linux-x86-64.so.2 构建一个测试可执行文件。

    使用上述命令链接可执行文件是不完整的。我猜您还必须设置LD_LIBRARY_PATH=/local/home/me/glibc-build:/local/home/me/glibc-build/elf:... 才能使my_test 工作,而LD_LIBRARY_PATH 的设置会阻止/bin/bash 工作。

    您可以通过运行(在您当前的环境中)来确认这一点:

    bash -c ./my_test
    

    这正是 GDB 正在做的事情,并且应该失败并出现同样的错误。

    如果我的猜测是正确的,解决此问题的最佳方法是取消设置 LD_LIBRARY_PATH 并使用 -Wl,-rpath=/local/home/me/glibc-build:/local/home/me/glibc-build/elf:... 重新链接您的可执行文件,以便 my_test 根本不需要设置 LD_LIBRARY_PATH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2022-09-27
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多