日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > Linux動態(tài)庫文件搜索路徑

          Linux動態(tài)庫文件搜索路徑

          發(fā)布人:電子禪石 時間:2019-09-05 來源:工程師 發(fā)布文章

          首先回答前面的問題,一共有多少種方法來指定告訴linux共享庫鏈接器ld.so已經編譯好的庫libbase.so的位置呢?答案是一共有五種,它們都可以通知ld.so去哪些地方找下已經編譯好的c語言函數(shù)動態(tài)庫,它們是:

             1)ELF可執(zhí)行文件中動態(tài)段中DT_RPATH所指定的路徑。即在編譯目標代碼時, 對gcc加入鏈接參數(shù)“-Wl,-rpath”指定動態(tài)庫搜索路徑,eg:gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c

             2)環(huán)境變量LD_LIBRARY_PATH 指定的動態(tài)庫搜索路徑

             3)/etc/ld.so.cache中所緩存的動態(tài)庫路徑,這個可以通過先修改配置文件/etc/ld.so.conf中指定的動態(tài)庫搜索路徑,然后執(zhí)行l(wèi)dconfig命令來改變。

             4)默認的動態(tài)庫搜索路徑/lib

             5)默認的動態(tài)庫搜索路徑/usr/lib

             另外:在嵌入式Linux系統(tǒng)的實際應用中,1和2被經常使用,也有一些相對簡單的的嵌入式系統(tǒng)會采用4或5的路徑來規(guī)范動態(tài)庫,3在嵌入式系統(tǒng)中使用的比較少, 因為有很多系統(tǒng)根本就不支持ld.so.cache。

             那么,動態(tài)鏈接器ld.so在這五種路徑中,是按照什么樣的順序來搜索需要的動態(tài)共享庫呢?答案這里先告知就是按照上面的順序來得,即優(yōu)先級是:1-->2-->3-->4-->5。我們可以寫簡單的程序來證明這個結論。

           

             首先,寫成5個函數(shù),這5個函數(shù)名稱都叫pt,但是里面的內容不一樣:

          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個函數(shù),然后將它們分別移到上面5種情況對應的5個不同目錄下:

          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/

           

             再次,編寫一個main函數(shù)m,讓它來調用函數(shù)pt:

          m.c

          #include <stdio.h>

           

           

          int main(){

                 printf("start....\n");

                 pt();

                 printf("......end\n");

                 return 0;

          }

           

             最后,準備環(huán)境,讓ld都知道這5個路徑:

          (a) 往/etc/ld.so.conf總增加一行,內容:/tmp/st/3,然后執(zhí)行 ldconfig 命令

          (b) export LD_LIBRARY_PATH=/tmp/st/2

          另外3中路徑,ld都可以得到,請接著看下面。

             之后測試:

          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í)行文件中動態(tài)段中DT_RPATH所指定的路徑,因此需要在編譯m.c的時候就指定路徑,由于其他路徑都也告訴了ld,很明顯,此種方法優(yōu)先級最高了。

           

          gcc m.c -o m -L/tmp/st/1 -lpt

          ./m

          start....

          2 path on the LD_LIBRARY_PATH

          ......end

          這里很顯然調用了LD_LIBRARY_PATH指定了路徑中的共享庫,因此此種情況優(yōu)先級第二。

           

          mv /tmp/st/2/libpt.so /tmp/st/2/libpt2.so

          /m

          start....

          3 path on the /etc/ld.so.conf

          ......end

          這里是調用了/etc/ld.so.cache中所緩存的動態(tài)庫路徑中的共享庫,因此此種情況優(yōu)先級第三。

           

          mv /tmp/st/3/libpt.so /tmp/st/3/libpt3.so

          ./m

          start....

          4 path on the /lib

          ......end

          這里是調用/lib中的共享庫,優(yōu)先級第四。

           

          rm /lib/libpt.so

          ./m

          start....

          5 path on the /usr/lib

          ......end

          這里是調用/lib中的共享庫,優(yōu)先級第五。

           

             故證明這五種路徑指定方法的優(yōu)先級是1-->2-->3-->4-->5!


          *博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



          關鍵詞:

          相關推薦

          技術專區(qū)

          關閉