14

ldd次のような共有ライブラリに対して実行すると、次libphp5.soの依存関係があることがわかりますlibmysqlclient.so.16

$ ldd ./libphp5.so
libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16
[その他の依存関係を切り取った]

これらの依存ファイル名とパス ( /usr/lib/mysql/libmysqlclient.so.16) は、共有ライブラリ バイナリに組み込まれていますか? または、このパスは via などの他の手段によって決定されますが/etc/ld.so.conf.d/mysql-i386.conf、これには次のものが含まれています。

/usr/lib/mysql/

もう1つのことが私を困惑させています:

ソースからコンパイルした共有ライブラリがあります。これは に依存していlibmysqlclient_rます。コンパイラはgcc、このライブラリを次のように生成するように切り替えます。

gcc -shared -L/usr/lib/mysql -lmysqlclient_r [+その他の各種スイッチ]

私がldd mylib.so見るとき:

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は へのシンボリック リンクなので、依存関係が として表示されるのはlibmysqlclient_r.so.16.0.0なぜですか。ここで私が見逃している魔法はありますか?lddlibmysqlclient_r.so.16

長年 Windows 開発者として働いてきた私は、gccLinux の開発に少し慣れていません。

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

4

2 に答える 2

15

実行することで、どのパスがどこから来ているかを確認できます

LD_DEBUG=libs ldd ./libphp5.so

これらの依存ファイル名とパス (/usr/lib/mysql/libmysqlclient.so.16) は、共有ライブラリ バイナリに組み込まれていますか?

ファイル名はほぼ確実です。パスは通常そうではありません。バイナリに焼き付けられたものを見ることができます

readelf -d ./libphp5.so

(NEEDED)および(RPATH)エントリを探します。

またman ld.so、読んでください。ダイナミック ローダーが共有ライブラリを検索する方法に影響を与える要因はld.so.conf多数LD_LIBRARY_PATHありsuidます-rpath

于 2011-11-17T17:24:29.133 に答える
1

これらの依存ファイル名とパス (/usr/lib/mysql/libmysqlclient.so.16) は、共有ライブラリ バイナリに組み込まれていますか?

はい、そうなる可能性があり、多くの場合そうです。ここでのキーワードは-rpath. ただし、ld.conf にも発言権があります。残念ながら、システム全体は非常に複雑です。

于 2011-11-17T16:21:03.727 に答える