2011-11-17 31 views
13

當運行ldd針對一個共享庫如libphp5.so我看到它有上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] 

我看到:該gcc編譯器開關,產生這個這個庫的樣子

 
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的符號鏈接,那麼爲什麼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)烤成的共享庫二進制?

文件名幾乎肯定是。路徑通常不是。你可以看到什麼是烤成二進制與

readelf -d ./libphp5.so 

查找(NEEDED)(RPATH)條目。

也給man ld.so一讀。有跡象表明,影響如何動態加載程序搜索共享庫的因素很多:ld.so.confLD_LIBRARY_PATH,可執行文件是否suid與否,glibc的是如何配置的,這是在鏈接時給出-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也有其說法。不幸的是整個系統非常複雜。