3

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

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

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

如果用户的可执行文件本身没有与 tcmalloc 链接会发生什么?

谢谢。

4

1 回答 1

3

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

这取决于几件事:

  • 您的共享库是否以公开的方式与 tcmalloc 链接mallocoperator new作为外部符号。通常,它确实如此。
  • 您的库的用户是链接到您的库还是在运行时加载它dlopen以及使用了哪些dlopen选项。

如果用户的可执行文件本身没有与 tcmalloc 链接会发生什么?

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

  1. malloc已经是用户应用程序/进程中的已解析符号。在这种情况下,您.so使用 that malloc。当用户加载您的时会发生这种.so情况dlopen
  2. malloc尚未解决,因此用户的应用程序/进程使用malloc来自 tcmalloc 的.so. 当用户链接到您的.soin 链接器命令行并且您.so-lc.

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

您将来可能想了解Unix 链接器如何自己回答这些问题。

于 2020-11-10T11:40:36.687 回答