【问题标题】:C/C++ dynamic-link library overloadC/C++ 动态链接库重载
【发布时间】:2017-01-12 01:36:34
【问题描述】:

在我的项目中,我需要修改glibc源代码的一些功能。 我只需要修改部分pthread。比如我在源码中修改了pthread_create.c或pthread_mutex_lock.c等多线程相关函数。然后,当我的具体程序运行时,我想指定它在需要使用这些功能时使用修改后的功能,并且不会影响其他功能。另外,我不想指定整个版本的glibc程序正在运行。 我需要寻求您的帮助,这个问题有什么好的解决方案吗? 谢谢!! 丁

【问题讨论】:

  • 为什么不简单地使用其他名称而不是替换标准函数?
  • 您的意思是要替换某些 glibc 函数的所有实例并保留其他函数的实现?在这种情况下,您可能会成功使用 LD_PRELOAD 从包含替换函数的 SO 中加载符号。
  • 感谢您的帮助。实际上,我需要在pthread函数内部获取一个特定的参数,例如系统分配的线程ID。所以我在函数内部插入了一个例程并重新编译了修改后的glibc,然后使用一个插桩工具来插桩我的例程以获得参数。正如你所建议的,我想重写pthread函数,但是我被glibc源代码中复杂的关系调用阻止了。所以我试图重新编译整个glibc并预加载libpthread.so。但它不能工作如果系统glibc版本与我的不同。我很困惑。

标签: c++ c linux shared-libraries glibc


【解决方案1】:

这是共享库插入器的工作。 Here 是一篇很棒的文章。

如果函数在共享库中,则可以指示运行时链接器调用另一个“插入”函数。插入器可以完全替换功能,也可以增强它。一个很好的例子是 malloc 系列函数,内存泄漏检测器和堆报告工具可以基于用户程序和系统调用之间的一组插入器。

插入器仅适用于共享 (.so) 库。静态 (.a) 库直接链接到可执行文件,调用不容易被拦截。

所有主要版本的 Linux 都支持 LD_PRELOAD 功能。

Here 是 pthread_create 的示例插入器。

【讨论】:

  • 谢谢你的帮助。实际上,我需要在pthread函数内部获取特定参数,例如系统分配的线程id。所以我在函数内部插入了一个例程并重新编译了修改后的glibc ,然后使用检测工具来检测我的例程以获取参数。正如你所建议的,我想重写 pthread 函数,但我被 glibc 源代码中复杂的关系调用阻止了。所以我试图重新编译整个 glibc并且只预加载libpthread.so。但是如果系统glibc版本与我的不同,它就无法工作。我很困惑。
  • 保持 glibc 不变。执行 pthread_create 并将其复制到插入器。在 interposer 版本中,添加您的自定义代码。如果您的函数具有不同的签名,只需创建一个新函数,例如my_pthread_create 并在没有插入器的情况下正常链接。
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 2019-03-13
  • 2016-05-09
  • 2022-01-22
相关资源
最近更新 更多