如何使用LD_PRELOAD将后台线程注入应用程序?

时间:2014-02-18 23:20:50

标签: linux gcc dynamic-linking ld-preload

我知道LD_PRELOAD可用于拦截对共享库中函数的调用(如果应用程序没有静态链接)。但是,我不知道它如何用于向应用程序添加其他功能或后台线程。

例如,我认为Berkeley labs checkpoint / restart使用此方法将后台线程添加到可能稍后检查点的应用程序中。

所以,现在问题是如何使用LD_PRELOAD将线程注入到已编译的应用程序中,而无需事先了解从此应用程序调用共享库的哪些功能?

1 个答案:

答案 0 :(得分:4)

这很简单 - 您可以实现_init函数 - 这将是void _init(void){},并且您可以在其中使用pthread_create(假设您将库与-lpthread链接)。您应该使用所需的其他-l依赖项编译库。 GCC将允许您将硬编码的_init()替换为另一个使用__attribute(构造函数)指定的入口点。无论如何,你的入口点都会被LD调用。

当你的库被注入时,它会在所有其他库之前被注入,但是它自己的依赖项也会得到解决,所以你做的任何调用通常都是正常的(一个值得注意的例外是你拦截后来调用的函数,你为此将需要使用dlfcn API来安全地执行此操作。