问题描述
我有许多与tcmalloc(.a)链接的可执行文件。 我通常在可执行文件级别执行此操作,以便可执行文件加载的任何共享库都可以从tcmalloc中受益。
在该共享库中使用tcmalloc可以吗?
谢谢。
解决方法
在该共享库中使用tcmalloc可以吗?
这取决于几件事:
- 您的共享库是否以tcmalloc链接的方式公开了
malloc
和operator new
作为外部符号。通常是这样。 - 您的库用户是否链接到您的库或在运行时使用
dlopen
以及使用了什么dlopen
选项加载它。
如果用户的可执行文件本身未与tcmalloc链接怎么办?
可能会发生以下两种情况之一:
-
malloc
在用户的应用程序/流程中已经是可解析的符号。在这种情况下,您的.so
使用该malloc
。当用户使用.so
向您的dlopen
加载时,就会发生这种情况。 -
malloc
尚未解决,因此用户的应用程序/进程使用了malloc
中tcmalloc中的.so
。当用户在链接器命令行中链接到您的.so
且您的.so
在-lc
之前时,就会发生这种情况。
您的.so
根本不链接tcmalloc可能是最可靠的选择。然后,应用程序的用户可以通过链接到tcmalloc或其他分配器,或者通过在运行时使用malloc
预先加载不同的分配器来尝试使用哪个LD_PRELOAD
实现。
您将来可能想学习how Unix linkers work来回答此类问题。