2012-11-21 5 views
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 [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()はまだlibcからmallocを呼び出していますが、どうすれば呼び出すことができますか?メモリマネージャーの代わりにlibcの??

+2

編集内容をロールバックしないでください:) – iabdalkader

+0

は、問題がlc_username()から発生しているようですが、そのコードを投稿できますか? – iabdalkader

+0

私はそれがlc_username()のためではないと思う、私はgetpwuid()への直接呼び出しを行い、同じ結果を得た。 – DreamLinuxer

答えて

2

あなたは(glibcを含む)他のライブラリの前に、あなたのライブラリをロードするためにLD_PRELOADを使用することができ、それが代わりにリンクされます、何かのように:

$ 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のユーザーは1人しか存在できません。したがって、mallocとそれに関連する関数(callocstrdupなど)へのすべての呼び出しを置き換えなかった場合は、brkを使用しないでください。

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

+0

メモリマネージャはレガシーコードですので、本当に変更したくありません。私は__tls_get_addr()のmallocを置き換えることでこれを回避することをお勧めします。 – DreamLinuxer

+0

'malloc'呼び出しを1つ1つ置き換えるのは良い考えではありません - 新しいものを見つけ続けるでしょう。 (Valgrindのようなソフトウェアパッケージがたくさんあります) – ugoren

+0

これはvalgrindでうまく動作します。つまり、valgrind @@ " – DreamLinuxer

関連する問題