在共享库中使用 tcmalloc
Using tcmalloc in a shared library
我有很多与 tcmalloc (.a) 链接的可执行文件。
我通常在可执行文件级别执行此操作,以便可执行文件加载的任何共享库都受益于 tcmalloc。
但是,我有一个场景需要向用户提供一个 .so 库。
可以在那个共享库中使用 tcmalloc 吗?
如果用户的可执行文件本身没有与 tcmalloc 链接会怎样?
谢谢。
Is it ok to use tcmalloc in that shared library?
这取决于几件事:
- 您的共享库是否以将
malloc
和 operator new
公开为外部符号的方式使用 tcmalloc linked。通常情况下,它会。
- 您的库的用户是否 link 访问您的库或在 运行 时使用
dlopen
加载它以及使用了哪些 dlopen
选项。
What happens if the user's executable itself is not linked with tcmalloc?
可能会发生以下两种情况之一:
malloc
已经是用户 application/process 中的已解析符号。在这种情况下,您的 .so
使用那个 malloc
。当用户使用 dlopen
. 加载您的 .so
时,就会发生这种情况
malloc
尚未解决,因此用户的 application/process 使用来自您 .so
的 tcmalloc 的 malloc
。当用户 link 在 linker 命令行中反对你的 .so
并且你的 .so
出现在 -lc
. 之前时,就会发生这种情况
对于您的 .so
来说,完全不 link tcmalloc 可能是最稳健的。然后,应用程序的用户可以决定使用哪个 malloc
实现,方法是 link 针对 tcmalloc 或其他分配器,或者通过在 运行 时使用 运行 预加载它们来尝试不同的分配器 LD_PRELOAD
.
您以后可能想学习how Unix linkers work自己回答此类问题。
我有很多与 tcmalloc (.a) 链接的可执行文件。 我通常在可执行文件级别执行此操作,以便可执行文件加载的任何共享库都受益于 tcmalloc。
但是,我有一个场景需要向用户提供一个 .so 库。
可以在那个共享库中使用 tcmalloc 吗?
如果用户的可执行文件本身没有与 tcmalloc 链接会怎样?
谢谢。
Is it ok to use tcmalloc in that shared library?
这取决于几件事:
- 您的共享库是否以将
malloc
和operator new
公开为外部符号的方式使用 tcmalloc linked。通常情况下,它会。 - 您的库的用户是否 link 访问您的库或在 运行 时使用
dlopen
加载它以及使用了哪些dlopen
选项。
What happens if the user's executable itself is not linked with tcmalloc?
可能会发生以下两种情况之一:
malloc
已经是用户 application/process 中的已解析符号。在这种情况下,您的.so
使用那个malloc
。当用户使用dlopen
. 加载您的 malloc
尚未解决,因此用户的 application/process 使用来自您.so
的 tcmalloc 的malloc
。当用户 link 在 linker 命令行中反对你的.so
并且你的.so
出现在-lc
. 之前时,就会发生这种情况
.so
时,就会发生这种情况
对于您的 .so
来说,完全不 link tcmalloc 可能是最稳健的。然后,应用程序的用户可以决定使用哪个 malloc
实现,方法是 link 针对 tcmalloc 或其他分配器,或者通过在 运行 时使用 运行 预加载它们来尝试不同的分配器 LD_PRELOAD
.
您以后可能想学习how Unix linkers work自己回答此类问题。