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