free
RedHat Linux 5.0には、関数とmalloc
以下を提供する社内共有ライブラリがあります。
>nm ./libmem_consumption.so | grep -P -e "\bfree\b|\bmalloc\b"
0000000000006540 T free
00000000000088a0 T malloc
この共有ライブラリは、プロセスのメモリ消費に関する情報を提供する役割を果たします。残念ながら、この共有ライブラリをApacheで使用すると、問題が発生しhttpd
ます。このライブラリでApachehttpdを実行すると、コアダンプが表示さlibc::free
れ、ポインタが無効であるというメッセージが表示されます。問題は、によってロードされるlibphp5.soによってロードされる共有ライブラリであるhttp.soにあるようですhttpd
。
実際、http.so
すべてをロードしなくても問題はなく、コアダンプはありません。(ロードするかしないかはhttp.so
、構成ファイルのディレクティブによって管理されます:extension = http.so)http.so
httpdプロセスのコアダンプをロードするとき。
httpd
このように起動されます:
LD_PRELOAD=./libmem_consumption.so ./bin/httpd -f config
終了時にコアダンプします。
LD_BIND_NOW = 1を設定しhttp.so
てロードすると、(gdbの下で)http.soが他のロードされたライブラリ(たとえば)をfree@plt
指していることがわかります。どうしてそれが可能でしょうか?libc::free
libphp5.so
free@plt
libmem_consumption.so::free
ちなみに、LD_DEBUG = allをエクスポートして出力をファイルに保存すると、libphp5.so(これもロードされます)の次の行が表示されます。
25788: symbol=free; lookup in file=/apache2/bin/httpd [0]
25788: symbol=free; lookup in file=/apache2/ps/lib/libmem_consumption.so [0]
25788: binding file /apache2/modules/libphp5.so [0] to /apache2/ps/lib/libmem_consumption.so [0]: normal symbol `free' [GLIBC_2.2.5]
そしてhttp.soでは完全に異なります:
25825: symbol=free; lookup in file=/apache2/ext/http.so [0]
25825: symbol=free; lookup in file=/apache2/ps/lib/libz.so.1 [0]
25825: symbol=free; lookup in file=/apache2/ps/lib/libcurl.so.4 [0]
25825: symbol=free; lookup in file=/lib64/libc.so.6 [0]
25825: binding file /apache2/ext/http.so [0] to /lib64/libc.so.6 [0]: normal symbol `free'
見上げるとLD_PRELOAD=./libmem_consumption.so
使われていないhttp.so
ようです。free
LD_PRELOADが無視されるのはなぜですか?