Linux動(dòng)態(tài)庫(kù)文件搜索路徑
首先回答前面的問(wèn)題,一共有多少種方法來(lái)指定告訴linux共享庫(kù)鏈接器ld.so已經(jīng)編譯好的庫(kù)libbase.so的位置呢?答案是一共有五種,它們都可以通知ld.so去哪些地方找下已經(jīng)編譯好的c語(yǔ)言函數(shù)動(dòng)態(tài)庫(kù),它們是:
1)ELF可執(zhí)行文件中動(dòng)態(tài)段中DT_RPATH所指定的路徑。即在編譯目標(biāo)代碼時(shí), 對(duì)gcc加入鏈接參數(shù)“-Wl,-rpath”指定動(dòng)態(tài)庫(kù)搜索路徑,eg:gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c
2)環(huán)境變量LD_LIBRARY_PATH 指定的動(dòng)態(tài)庫(kù)搜索路徑
3)/etc/ld.so.cache中所緩存的動(dòng)態(tài)庫(kù)路徑,這個(gè)可以通過(guò)先修改配置文件/etc/ld.so.conf中指定的動(dòng)態(tài)庫(kù)搜索路徑,然后執(zhí)行l(wèi)dconfig命令來(lái)改變。
4)默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/lib
5)默認(rèn)的動(dòng)態(tài)庫(kù)搜索路徑/usr/lib
另外:在嵌入式Linux系統(tǒng)的實(shí)際應(yīng)用中,1和2被經(jīng)常使用,也有一些相對(duì)簡(jiǎn)單的的嵌入式系統(tǒng)會(huì)采用4或5的路徑來(lái)規(guī)范動(dòng)態(tài)庫(kù),3在嵌入式系統(tǒng)中使用的比較少, 因?yàn)橛泻芏嘞到y(tǒng)根本就不支持ld.so.cache。
那么,動(dòng)態(tài)鏈接器ld.so在這五種路徑中,是按照什么樣的順序來(lái)搜索需要的動(dòng)態(tài)共享庫(kù)呢?答案這里先告知就是按照上面的順序來(lái)得,即優(yōu)先級(jí)是:1-->2-->3-->4-->5。我們可以寫(xiě)簡(jiǎn)單的程序來(lái)證明這個(gè)結(jié)論。
首先,寫(xiě)成5個(gè)函數(shù),這5個(gè)函數(shù)名稱都叫pt,但是里面的內(nèi)容不一樣:
pt1.c
#include <stdio.h>
void pt(){
printf("1 path on the gcc give \n");
}
pt2.c
#include <stdio.h>
void pt(){
printf("2 path on the LD_LIBRARY_PATH \n");
}
pt3.c
#include <stdio.h>
void pt(){
printf("3 path on the /etc/ld.so.conf \n");
}
pt4.c
#include <stdio.h>
void pt(){
printf("4 path on the /lib \n");
}
pt5.c
#include <stdio.h>
void pt(){
printf("5 path on the /usr/lib \n");
}
然后,分別編譯這5個(gè)函數(shù),然后將它們分別移到上面5種情況對(duì)應(yīng)的5個(gè)不同目錄下:
gcc -fPIC -c pt1.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /tmp/st/1/
gcc -fPIC -c pt2.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /tmp/st/2/
gcc -fPIC -c pt3.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /tmp/st/3/
gcc -fPIC -c pt4.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /lib/
gcc -fPIC -c pt5.c -o pt.o
gcc -shared pt.o -o libpt.so
mv libpt.so /usr/lib/
再次,編寫(xiě)一個(gè)main函數(shù)m,讓它來(lái)調(diào)用函數(shù)pt:
m.c
#include <stdio.h>
int main(){
printf("start....\n");
pt();
printf("......end\n");
return 0;
}
最后,準(zhǔn)備環(huán)境,讓ld都知道這5個(gè)路徑:
(a) 往/etc/ld.so.conf總增加一行,內(nèi)容:/tmp/st/3,然后執(zhí)行 ldconfig 命令
(b) export LD_LIBRARY_PATH=/tmp/st/2
另外3中路徑,ld都可以得到,請(qǐng)接著看下面。
之后測(cè)試:
gcc m.c -o m1 -L/tmp/st/1 -lpt -Wl,-rpath,/tmp/st/1
./m1
start....
1 path on the gcc give
......end
這里在可執(zhí)行文件中動(dòng)態(tài)段中DT_RPATH所指定的路徑,因此需要在編譯m.c的時(shí)候就指定路徑,由于其他路徑都也告訴了ld,很明顯,此種方法優(yōu)先級(jí)最高了。
gcc m.c -o m -L/tmp/st/1 -lpt
./m
start....
2 path on the LD_LIBRARY_PATH
......end
這里很顯然調(diào)用了LD_LIBRARY_PATH指定了路徑中的共享庫(kù),因此此種情況優(yōu)先級(jí)第二。
mv /tmp/st/2/libpt.so /tmp/st/2/libpt2.so
/m
start....
3 path on the /etc/ld.so.conf
......end
這里是調(diào)用了/etc/ld.so.cache中所緩存的動(dòng)態(tài)庫(kù)路徑中的共享庫(kù),因此此種情況優(yōu)先級(jí)第三。
mv /tmp/st/3/libpt.so /tmp/st/3/libpt3.so
./m
start....
4 path on the /lib
......end
這里是調(diào)用/lib中的共享庫(kù),優(yōu)先級(jí)第四。
rm /lib/libpt.so
./m
start....
5 path on the /usr/lib
......end
這里是調(diào)用/lib中的共享庫(kù),優(yōu)先級(jí)第五。
故證明這五種路徑指定方法的優(yōu)先級(jí)是1-->2-->3-->4-->5!
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。