在共享库中使用tcmalloc

问题描述

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

但是,我有一种情况需要向用户提供.so库。

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

如果用户的可执行文件本身未与tcmalloc链接怎么办?

谢谢。

解决方法

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

这取决于几件事:

  • 您的共享库是否以tcmalloc链接的方式公开了mallocoperator new作为外部符号。通常是这样。
  • 您的库用户是否链接到您的库或在运行时使用dlopen以及使用了什么dlopen选项加载它。

如果用户的可执行文件本身未与tcmalloc链接怎么办?

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

  1. malloc在用户的应用程序/流程中已经是可解析的符号。在这种情况下,您的.so使用该malloc。当用户使用.so向您的dlopen加载时,就会发生这种情况。
  2. malloc尚未解决,因此用户的应用程序/进程使用了​​malloc中tcmalloc中的.so。当用户在链接器命令行中链接到您的.so且您的.so-lc之前时,就会发生这种情况。

您的.so根本不链接tcmalloc可能是最可靠的选择。然后,应用程序的用户可以通过链接到tcmalloc或其他分配器,或者通过在运行时使用malloc预先加载不同的分配器来尝试使用哪个LD_PRELOAD实现。

您将来可能想学习how Unix linkers work来回答此类问题。