在共享库中使用 tcmalloc

Using tcmalloc in a shared library

我有很多与 tcmalloc (.a) 链接的可执行文件。 我通常在可执行文件级别执行此操作,以便可执行文件加载的任何共享库都受益于 tcmalloc。

但是,我有一个场景需要向用户提供一个 .so 库。

可以在那个共享库中使用 tcmalloc 吗?

如果用户的可执行文件本身没有与 tcmalloc 链接会怎样?

谢谢。

Is it ok to use tcmalloc in that shared library?

这取决于几件事:

  • 您的共享库是否以将 mallocoperator new 公开为外部符号的方式使用 tcmalloc linked。通常情况下,它会。
  • 您的库的用户是否 link 访问您的库或在 运行 时使用 dlopen 加载它以及使用了哪些 dlopen 选项。

What happens if the user's executable itself is not linked with tcmalloc?

可能会发生以下两种情况之一:

  1. malloc 已经是用户 application/process 中的已解析符号。在这种情况下,您的 .so 使用那个 malloc。当用户使用 dlopen.
  2. 加载您的 .so 时,就会发生这种情况
  3. malloc 尚未解决,因此用户的 application/process 使用来自您 .so 的 tcmalloc 的 malloc。当用户 link 在 linker 命令行中反对你的 .so 并且你的 .so 出现在 -lc.
  4. 之前时,就会发生这种情况

对于您的 .so 来说,完全不 link tcmalloc 可能是最稳健的。然后,应用程序的用户可以决定使用哪个 malloc 实现,方法是 link 针对 tcmalloc 或其他分配器,或者通过在 运行 时使用 运行 预加载它们来尝试不同的分配器 LD_PRELOAD.

您以后可能想学习how Unix linkers work自己回答此类问题。