【问题标题】:How to apply LD_PRELOAD only to target program?如何仅将 LD_PRELOAD 应用于目标程序?
【发布时间】:2021-02-08 16:00:08
【问题描述】:

我正在尝试调试堆损坏(使用 QIRA 调试器);仅适用于 Doug Lea 的 Malloc。

我已尝试执行以下操作:

LD_PRELOAD=./malloc.so qira ./program $(cat shfree5)

我收到以下错误:

错误:ld.so:无法预加载来自 LD_PRELOAD 的对象“./malloc.so”(错误的 ELF 类:ELFCLASS32):已忽略。

这是因为加载程序尝试将 x86 malloc.so 链接到 x64 qira

我只想将LD_PRELOAD 应用于./program,而不是qira;我已尝试使用env 命令,但无法使其正常工作。

提前致谢!

【问题讨论】:

  • 我找不到详细的 qira 文档,但是你需要启动 qira,在里面设置环境变量,然后启动你的程序。
  • 不幸的是,在 Linux 上处理所有 LD_* 环境变量在混合 32/64 位环境中都失败了。请参阅 stackoverflow.com/questions/36849507/… 了解一些可能有帮助的信息。
  • env LD_PRELOAD=./malloc.so ./program ... 应该可以工作如果你有一个在qira 下工作的env 的实现。
  • “我正在尝试调试堆损坏”——使用 Address Sanitizer 而不是 LD_PRELOADing debug malloc,您可能会得到更多。跨度>

标签: c x86 heap-memory elf ld-preload


【解决方案1】:

看来你可以在环境中设置QEMU_SET_ENV=LD_PRELOAD=./malloc.so来影响进程。

我会注意到,您可以通过设置 QEMU_UNSET_ENV=FOO,BAR 类似地取消设置目标的环境变量。

【讨论】:

  • @Joshua:再多一点什么? Qira 使用 QEMU。我通过使用伪造的 .so 文件针对 env 运行它进行了测试,这给了我来自 ld.so 的错误,表明它使用了该设置值。
  • 我在答案中添加了环境这个词,因为它显然不清楚。
  • 非常感谢!这似乎有效,现在动态链接!
猜你喜欢
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多