【问题标题】:How can I inject a background thread to an application with LD_PRELOAD?如何使用 LD_PRELOAD 将后台线程注入应用程序?
【发布时间】:2014-03-19 00:38:50
【问题描述】:

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

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

那么,现在的问题是如何在事先不知道从该应用程序调用共享库的哪些函数的情况下,如何使用 LD_PRELOAD 将线程注入到已编译的应用程序中?

【问题讨论】:

  • 我相信有各种各样的函数,如果存在,将在库加载时自动调用。您可能会在动态链接器的文档中找到它。

标签: linux gcc dynamic-linking ld-preload


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2021-06-26
    相关资源
    最近更新 更多