[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:44855] Re: シンボル未解決の共有ライブラリ作成



aritaです。
上川様、レスありがとうございます。

Junichi Uekawa wrote:

>こんにちは,
>
>  
>
>>共有ライブラリについて質問があります。
>>
>>私がやりたいことは、-L. -lBをつけなくてもシンボルが見つからない
>>というリンクエラーを発生させずにfuncBがUNDEFのままlibA.soを作成
>>することです。当然lddで見てもlibB.soはリンクしていないです。
>>    
>>
>
>なぜそんなことをしたいのでしょうか?
>  
>
きっかけは以下のような事象に出会い疑問に思ったからです。
[事象]
httpd-2.0.54を以下のようにビルドした場合、生成されたhttpdおよびmod_ssl.soを
lddコマンドで見てみると利用しているOpenSSLのライブラリ(crypto.so, ssl.so)が
mod_ssl.soにはリンクされておらずhttpdにリンクされていました。
$ ./configure --enable-so --enable-ssl=shared --with-ssl=/usr/local/ssl
$ make

実際にOpenSSLのAPIを利用しているのはmod_ssl.soであるため当然mod_ssl.soに
関連づけされていると思っていたので疑問におもいました。

この事象を私は以下のように考察しました。
httpdがロードされる時にリンクしているcrypto.soとssl.so
(httpdが必要としているわけではないが)を一緒にロードし、
DSOであるmod_ssl.soをdlopenによりロード(または関数実行)する時にそれにより
シンボル解決するのだろう。

ではこのようにシンボルのバインドをロード(または関数実行)時に遅らせることが
できるような共有ライブラリ(またはDSO)をどのように作成しているのだろうか?
という疑問がわいてきました。実際httpd-2.0.54ではlibtoolを使っておりますが、
リンク時のログをみてもやはりcrypto.soとssl.soはリンクしていません(下記参照)
なぜリンクエラーがでないのでしょうか?

実際にこのようなmod_ssl.soが存在するのですから実現可能なのでしょうが、
これをgccやldで明示的に制御するにはどのようにすればよいのでしょう?

----------- ここから ------------
/httpd-2.0.54/srclib/apr/libtool --silent --mode=link gcc -g -O2 -pthread
-DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500
-D_BSD_SOURCE -D_SVID_SOURCE -D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/srclib/apr/include
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/srclib/apr-util/include
-I.
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/os/unix
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/server/mpm/prefork
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/modules/http
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/modules/filters
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/modules/proxy
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/include
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/modules/generators
-I/usr/include/openssl -I/usr/kerberos/include
-I/home/arita/tmp/mod_ssl/httpd-2.0.54/modules/dav/main
-export-dynamic -o mod_ssl.la -rpath /home/arita/tmp/mod_ssl/apache2/modules
-module -avoid-version mod_ssl.lo ssl_engine_config.lo
ssl_engine_dh.lo ssl_engine_init.lo ssl_engine_io.lo ssl_engine_kernel.lo
ssl_engine_log.lo ssl_engine_mutex.lo ssl_engine_pphrase.lo
ssl_engine_rand.lo
ssl_engine_vars.lo ssl_expr.lo ssl_expr_eval.lo ssl_expr_parse.lo
ssl_expr_scan.lo
ssl_scache.lo ssl_scache_dbm.lo ssl_scache_shmcb.lo ssl_scache_shmht.lo
ssl_util.lo ssl_util_ssl.lo ssl_util_table.lo
----------- ここまで ------------



>上川
>
>
>
>
>  
>