【问题标题】:LD_PRELOAD not preloading all symbolsLD_PRELOAD 未预加载所有符号
【发布时间】:2012-06-26 21:38:24
【问题描述】:

我正在尝试 LD_PRELOAD 函数,例如 mmapreadopenclone 等...,但是虽然某些函数确实成功地获得了 LD_PRELOAD,但其他函数却没有。例如,mmapreadopen 已完全预加载,但 clone 未预加载,而我确信 clone 正在从我的程序中调用,正如 strace 所报告的那样,因为我正在使用线程。 clone 在这里没有被 LD_PRELOADed 的原因是什么?

【问题讨论】:

  • 您是如何发现clone 没有被预加载的?您如何确定其他人正在预加载?
  • 我在我的 LD_PRELOADed 版本中放了一个 printf。
  • 请注意,GCC 是(无)有用的,并且作为其优化过程的一部分,它会更改对其他函数的几个函数调用(例如 printf()'ing 使用常量字符串会导致 puts( ))。因此,请确保您的符号是您所期望的!
  • strace 显示系统调用——afaik 与您尝试替换的对 C wrapper 的调用不同。您可能要检查的一件事是clone() 的地址,并与/proc/<pid>/maps 进行比较以确定正在使用哪个库。系统调用可能不是通过 clone() 包装函数进行的。

标签: c linux gcc ld-preload


【解决方案1】:

strace 显示系统调用; LD_PRELOAD 覆盖(C 库)函数。这可能表明 clone 系统调用正在由不同的函数调用,而不通过 clone 函数符号(例如,通过 C 库中的内部链接,或直接调用系统调用)。

确实,clone 不是 Posix 库函数;这是一个碰巧暴露的 Linux 实现细节。手册页说:

clone() 和 sys_clone 调用是特定于 Linux 的,不应在旨在可移植的程序中使用。

相反,您应该 LD_PRELOAD-override pthread_create 等;在其他平台上,它们可能在没有clone 的情况下实现。

【讨论】:

  • 更重要的是,pthread_create不能调用clone,因为clone在为应用程序保留的命名空间中。
猜你喜欢
  • 2016-07-02
  • 2019-11-19
  • 1970-01-01
  • 2015-04-25
  • 2010-11-13
  • 2014-07-14
  • 2015-01-24
  • 2013-07-17
相关资源
最近更新 更多