LD_PRELOAD不适用于printf

我正在使用LD_PRELOAD在Linux中捕获write()系统调用。 我成功地能够做这个写系统调用,并使其工作。

但是,当我打电话printf()那个时候它不起作用。 如果我们使用strace观察printf堆栈跟踪,我发现printf调用write()系统调用写入控制台,但是在那个时候write()系统调用在调用write()系统调用。

任何人都知道为什么会发生这种情况?

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