2012-11-21 23 views
6

我們的程序中有一個自定義內存管理器,我們所有的malloc/free調用都由內存管理器管理,但是在程序的最初階段getpwuid()將會調用並在某些客戶機啓動NSS_LDAP它會調用malloc的從libc中不導致的錯誤在我們的內存管理器我們的內存管理器,從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 [email protected]@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的??

+2

不回滾編輯:) – iabdalkader

+0

看起來問題來自'lc_username()'你能發佈該代碼嗎? – iabdalkader

+0

我認爲這不是因爲lc_username(),我直接調用getpwuid()並得到了相同的結果。 – DreamLinuxer

回答

2

您可以使用LD_PRELOAD任何其他庫(包括glibc的)前到您的書架,它會被替代的聯繫,是這樣的:

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

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

+0

我試過LD_PRELOAD,但它仍然從libc中調用malloc :( – DreamLinuxer

+0

我認爲它沒有工作的原因是__tls_get_addr() – DreamLinuxer

+0

@DreamLinuxer作爲一個便箋,你不應該調用'getpwuid( )'你應該使用可重入版本'getpwuid_r()' – iabdalkader

0

您可以更改內存管理器以使用mmap未讀的brk

一個進程中只能有一個用戶brk。因此,如果您尚未將所有呼叫都替換爲malloc及相關功能(calloc,strdup及更多),則不得使用brk。但是,沒有這樣的問題。你的內存管理器可以使用mmap,而malloc仍然可以並行工作。

+0

內存管理器是遺留代碼,我真的不想修改它。我更喜歡通過替換__tls_get_addr()中的malloc來解決這個問題。 – DreamLinuxer

+0

我不認爲逐個更換'malloc'是一個好主意 - 你會繼續找到新的。你需要找到一種方法來自動替換所有的調用(很多軟件包,比如Valgrind) – ugoren

+0

它在valgrind中運行正常,這意味着malloc調用在valgrind @@下正確替換「 – DreamLinuxer