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

标签 c++ c

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

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 的内存管理器??

最佳答案

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

$ LD_PRELOAD=/path/to/library/libmymalloc.so /bin/myprog

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

关于c++ - 具有线程本地存储的自定义内存管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13488183/

相关文章:

c++ - 如何在 Mac 上自动获取 C++ 程序的异常类型和消息?

c++ - Win32 在文本框中输入时触发确定按钮

c++ - 在无限循环中调用 Sleep() 有多重要?

python - 在 Python 和 Perl 上绑定(bind) C 库但相反

c - 当函数的返回类型不允许我这样做时,如何在 C 中返回错误代码?

c - 哪个更好? 32 位 MCU 中的 int8_t 与 int32_t

c++ - "address of array"的实际用例是什么?

c++ - Python C++ 扩展 : compile only modified source files

c - 在结构中访问结构

c - 在 C 中验证三角形