2011-11-17 19 views
13

私は、このようなlibphp5.soなどの共有ライブラリとlddを実行すると、私はそれがlibmysqlclient.so.16に依存していることを参照してください。Linuxで共有ライブラリの依存関係のパスはどのように決定されますか?

 
$ ldd ./libphp5.so 
libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 
[other dependencies snipped out] 

は、共有ライブラリのバイナリに焼いたこれらの依存ファイル名とパス(/usr/lib/mysql/libmysqlclient.so.16)はありますか?あるいは、このパスは、偶然に含まれている、など/etc/ld.so.conf.d/mysql-i386.conf介するなど、いくつかの他の手段によって決定されます。

/usr/lib/mysql/ 

もう一つの事は私に不可解されています

私はソースからコンパイルすることを持っている共有ライブラリがあります。これはlibmysqlclient_rに依存しています。私はldd mylib.so私が見ていたとき

 
gcc -shared -L/usr/lib/mysql -lmysqlclient_r [+various other switches] 

 
libmysqlclient_r.so.16 => /usr/lib/mysql/libmysqlclient_r.so.16 (0x0055c000) 

しかし、私が見/usr/lib/mysqlディレクトリに:

 
-rwxr-xr-x. libmysqlclient_r.so -> libmysqlclient_r.so.16.0.0 
lrwxrwxrwx. libmysqlclient_r.so.16 -> libmysqlclient_r.so.16.0.0 
-rwxr-xr-x. libmysqlclient_r.so.16.0.0 
lrwxrwxrwx. libmysqlclient.so -> libmysqlclient.so.16.0.0 
lrwxrwxrwx. libmysqlclient.so.16 -> libmysqlclient.so.16.0.0 
-rwxr-xr-x. libmysqlclient.so.16.0.0 

libmysqlclient_r.soがある。このこのライブラリーを作製するためにgccコンパイラスイッチは次のようになりlibmysqlclient_r.so.16.0.0へのシンボリックリンクです。なぜlddには、依存関係がlibmysqlclient_r.so.16と表示されますか?私はここで行方不明のいくつかの魔法がありますか?

私は長年にわたりWindows開発者であったため、gccとLinuxでの開発に少し新しくなっています。

私のLinuxディストリビューションはCentOS 6.0 x86-32bitです。

答えて

14

あなたは

LD_DEBUG=libs ldd ./libphp5.so 

を実行して、パスがどこから来ているかを見ることができ、共有ライブラリのバイナリに焼いたこれらの依存ファイル名とパス(/usr/lib/mysql/libmysqlclient.so.16)です?

ファイル名はほぼ確実です。パスは通常そうではありません。あなたは(NEEDED)(RPATH)エントリの

readelf -d ./libphp5.so 

表情でバイナリに焼いているかを見ることができます。

man ld.soも読んでください。共有ライブラリのためにどのようにダイナミックローダ検索に影響を与える多くの要因があります:ld.so.confLD_LIBRARY_PATH、実行ファイルは、glibcのが設定されたか、suidであるかどうか、-rpath設定はリンク時に与えられた、などなど

+0

が、おかげでそれはですいくつかの有用なポインター。 – Kev

+0

あなたは分かりませんが、私はこれをさらにアップホートすることができればと思います。私の質問は、Pythonチーズショップパッケージ(MySQL-Python)でコンパイル/ビルドにもかかわらず 'libmysqlclient_r'を読み込むことができなくなってしまいました。 'LD_DEBUG = libs ldd'は私の人生をより安全にしました。 '/ etc/ld.co.conf.d'に保存されたパスファイルは' .conf'で終わらず、 '/ etc/ld.so.conf'ファイルは' include ld.so. conf.d/* .conf'となります。したがって、 '/ usr/lib/mysql'フォルダは決して検索されませんでした。 – Kev

1

これらの依存関係のファイル名とパス(/usr/lib/mysql/libmysqlclient.so.16)は共有ライブラリのバイナリに焼き付けられていますか?

はい、頻繁に使用できます。ここのキーワードは-rpathです。しかし、ld.confにもそのことが言われています。残念ながら、システム全体はかなり複雑です。

関連する問題