我知道LD_PRELOAD可以用来拦截对共享库中的函数的调用(如果应用程序不是静态链接的话)。 但是,我不知道如何用它来为应用程序添加额外的function或后台线程。
例如,我认为伯克利实验室检查点/重新启动使用此方法将后台线程添加到稍后可能检查点的应用程序。
所以,现在的问题是,如何使用LD_PRELOAD将线程注入已编译的应用程序,而不必知道共享库的哪些函数正在从此应用程序调用?
这是一个简单的事情 – 你可以实现_init函数 – 这将是无效的_init(void){},你可以在其中使用pthread_create(假设你的库与-lpthread链接)。 你应该用你需要的其他-l依赖来编译你的库。 GCC将允许你用一个__attribute(构造函数)指定的另一个入口点替换硬编码的_init()。 无论如何,你的入口点将被LD调用。
当你的库被注入时,它会被所有其他的注入,但它自己的依赖关系也得到了解决,所以你所做的任何调用一般都是可以的(一个明显的例外是,如果你拦截后来调用的函数,你需要使用dlfcn API来安全地执行)。