6

私たちのプログラムにはカスタム メモリ マネージャーがあり、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の代わりにメモリマネージャーを呼び出すにはどうすればよいですか??

4

2 に答える 2

2

他のライブラリ(glibcを含む)の前にライブラリをロードするために使用できLD_PRELOAD、代わりに次のようにリンクされます。

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

それがどのように機能するかを示すチュートリアルがここにあります、それは挿入された例さえ持っていますmalloc

于 2012-11-21T07:32:48.793 に答える
0

mmapの instreadを使用するようにメモリ マネージャーを変更できますbrk

brk1 つのプロセスに存在できるユーザーは 1 人だけです。したがって、 および関連する関数 ( など) のすべての呼び出しを置き換えていない場合は、mallocを使用しないでください。callocstrdupbrk

mmap、しかし、そのような問題はありません。メモリ マネージャーは を使用できmmapmalloc並行して動作することもできます。

于 2012-11-21T08:48:36.950 に答える