我有许多与 tcmalloc (.a) 链接的可执行文件。我通常在可执行级别执行此操作,以便可执行文件加载的任何共享库都受益于 tcmalloc。
但是,我有一个需要向用户提供 .so 库的场景。
在那个共享库中使用 tcmalloc 可以吗?
如果用户的可执行文件本身没有与 tcmalloc 链接会发生什么?
谢谢。
在那个共享库中使用 tcmalloc 可以吗?
这取决于几件事:
malloc
并operator new
作为外部符号。通常,它确实如此。dlopen
以及使用了哪些dlopen
选项。如果用户的可执行文件本身没有与 tcmalloc 链接会发生什么?
可能会发生以下两种情况之一:
malloc
已经是用户应用程序/进程中的已解析符号。在这种情况下,您.so
使用 that malloc
。当用户加载您的时会发生这种.so
情况dlopen
。malloc
尚未解决,因此用户的应用程序/进程使用malloc
来自 tcmalloc 的.so
. 当用户链接到您的.so
in 链接器命令行并且您.so
的-lc
..so
完全不链接 tcmalloc可能对您来说是最强大的。然后,应用程序的用户malloc
可以通过链接 tcmalloc 或其他分配器来决定使用哪个实现,或者通过在运行时使用预加载来尝试不同的分配器LD_PRELOAD
。
您将来可能想了解Unix 链接器如何自己回答这些问题。