【发布时间】:2012-06-26 21:38:24
【问题描述】:
我正在尝试 LD_PRELOAD 函数,例如 mmap、read、open、clone 等...,但是虽然某些函数确实成功地获得了 LD_PRELOAD,但其他函数却没有。例如,mmap、read 和 open 已完全预加载,但 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