2011-03-22 67 views
5

我使用LD_PRELOAD捕捉在linux的write()系统调用。 我已经成功地完成了写入系统调用的工作。LD_PRELOAD不工作的printf

但是,当我调用printf(),那个时候它不工作。如果我们使用strace观察printf堆栈跟踪,我发现printf调用了write()系统调用来写入控制台,但那时我的write()系统调用在实际调用write()系统调用之前未被调用。

任何人有任何想法,为什么会出现这种情况?

+0

发布一些代码片段,以便我们可以看到发生了什么。 – 2011-03-22 18:11:46

+0

[这](https://stackoverflow.com/questions/13374240/why-ld-preload-doesnt-work-for-one-of-loaded-shared-libraries)可能也有关。 – Albert 2017-10-20 08:03:34

回答

11

从一个库到另一或从可执行到动态加载库函数调用经过PLT(过程链接表),并能够通过使用LD_PRELOAD的被重定向。但是,库中的函数调用可以在编译时解决,而不通过PLT。因此它们不能被LD_PRELOAD重定向。由于printf和write都被编译到libc.so.6中,因此printf写入的调用永远不会通过PLT寻找可能的重定向,但是当您直接从应用程序(或从另一个共享库)调用写入时, 。