首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有线程本地存储的自定义内存管理器

具有线程本地存储的自定义内存管理器
EN

Stack Overflow用户
提问于 2012-11-21 15:18:40
回答 2查看 342关注 0票数 6

在我们的程序中有一个自定义的内存管理器,我们所有的malloc/free调用都是由内存管理器管理的,但是在程序的初始阶段,getpwuid()将被调用,并且在一些激活了nss_ldap的客户机器上,它将从libc而不是我们的内存管理器调用malloc,这会导致内存管理器中的错误,来自gdb的堆栈报告是:

代码语言:javascript
复制
Breakpoint 2, 0x0000003df8cc6eb0 in brk () from /lib64/libc.so.6
0  0x0000003df8cc6eb0 in brk () from /lib64/libc.so.6
1  0x0000003df8cc6f72 in sbrk () from /lib64/libc.so.6
2  0x0000003df8c73d29 in __default_morecore () from /lib64/libc.so.6
3  0x0000003df8c70090 in _int_malloc () from /lib64/libc.so.6
4  0x0000003df8c70c9d in malloc () from /lib64/libc.so.6
5  0x0000003df880fc65 in __tls_get_addr () from /lib64/ld-linux-x86-64.so.2
6  0x00002aaaae302a7c in _nss_ldap_inc_depth () from /lib64/libnss_ldap.so.2
7  0x00002aaaae2f91a4 in _nss_ldap_enter () from /lib64/libnss_ldap.so.2
8  0x00002aaaae2f942c in _nss_ldap_getbyname () from /lib64/libnss_ldap.so.2
9  0x00002aaaae2f9aa9 in _nss_ldap_getpwuid_r () from /lib64/libnss_ldap.so.2
10 0x0000003df8c947c5 in getpwuid_r@@GLIBC_2.2.5 () from /lib64/libc.so.6
11 0x0000003df8c9412f in getpwuid () from /lib64/libc.so.6
12 0x0000000001414be3 in lc_username ()

我跟踪了_nss_ldap_inc_depth()的代码,似乎__tls_get_addr()调用是因为使用了线程本地存储,我尝试将内存管理器更改为共享库,但__tls_get_addr()仍然从libc调用malloc,我如何才能让它调用我们的内存管理器而不是libc的??

EN

回答 2

Stack Overflow用户

发布于 2012-11-21 15:32:49

您可以使用LD_PRELOAD在任何其他库(包括glibc)之前加载您的库,并且它将被链接,如下所示:

代码语言:javascript
复制
$ LD_PRELOAD=/path/to/library/libmymalloc.so /bin/myprog

有一个教程here展示了它是如何工作的,它甚至有一个插入malloc的示例

票数 2
EN

Stack Overflow用户

发布于 2012-11-21 16:48:37

您可以更改内存管理器以使用brkmmap实例。

一个进程中只能有一个brk用户。因此,如果您还没有替换所有对malloc和相关函数(callocstrdup等)的调用,就不能使用brk

然而,mmap没有这样的问题。您的内存管理器可以使用mmap,而malloc仍然可以并行工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13488183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档