我有许多与tcmalloc (.a)链接的可执行文件。我通常在可执行级别执行,这样由可执行文件加载的任何共享库都可以从tcmalloc中获益。
但是,我有一个场景,需要向用户提供一个.so库。
在共享库中使用tcmalloc可以吗?
如果用户的可执行文件本身没有与tcmalloc链接,会发生什么情况?
谢谢。
发布于 2020-11-10 11:40:36
在共享库中使用tcmalloc可以吗?
这取决于以下几点:
malloc和operator new公开为外部符号。正常情况下是这样的。dlopen在运行时加载它,以及使用什么dlopen选项。如果用户的可执行文件本身没有与tcmalloc链接,会发生什么情况?
这两件事之一是可以发生的:
malloc已经是一个解析符号。在本例中,您的.so使用该malloc。当用户用.so加载dlopen时,就会发生这种情况。malloc尚未解决,因此用户的应用程序/进程使用来自.so的tcmalloc的malloc。当用户在链接器命令行中链接到您的.so,而您的.so出现在-lc之前时,就会发生这种情况。对于您的.so来说,完全不链接tcmalloc可能是最健壮的。然后,应用程序的用户可以通过链接tcmalloc或其他分配程序来决定使用哪个malloc实现,或者使用LD_PRELOAD在运行时预加载不同的分配器。
你可能会喜欢学习Unix链接器是如何工作的来回答你将来的这些问题。
https://stackoverflow.com/questions/64768037
复制相似问题