久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > linux開發:linux內(nei)存加(jia)載動(dong)態庫?

linux開發:linux內存加載(zai)動態庫? 時間:2019-03-27     ; 來源:華清遠(yuan)見

1 Linux應(ying)用(yong)程序可能會使(shi)用(yong)到兩種(zhong)函(han)數庫(ku)(ku),一種(zhong)靜(jing)(jing)態庫(ku)(ku)、一種(zhong)動(dong)態庫(ku)(ku),靜(jing)(jing)態庫(ku)(ku)以.a為(wei)擴展(zhan)名(ming),動(dong)態庫(ku)(ku)以.so為(wei)擴展(zhan)名(ming)。二者都(dou)使(shi)用(yong)廣泛。

2 動態(tai)庫和靜(jing)態(tai)庫的基(ji)本概念?

靜態(tai)(tai)庫(ku),是在可(ke)執(zhi)(zhi)行(xing)(xing)(xing)(xing)程(cheng)序(xu)(xu)(xu)連接時(shi)就(jiu)(jiu)已經加(jia)入到執(zhi)(zhi)行(xing)(xing)(xing)(xing)碼中(zhong),在物理(li)上成(cheng)為執(zhi)(zhi)行(xing)(xing)(xing)(xing)程(cheng)序(xu)(xu)(xu)的(de)一部分;使用靜態(tai)(tai)庫(ku)編譯的(de)程(cheng)序(xu)(xu)(xu)運行(xing)(xing)(xing)(xing)時(shi)無(wu)需該庫(ku)文(wen)件(jian)支持,哪(na)里都可(ke)以用,但是生(sheng)成(cheng)的(de)可(ke)執(zhi)(zhi)行(xing)(xing)(xing)(xing)文(wen)件(jian)較大。動(dong)態(tai)(tai)庫(ku),是在可(ke)執(zhi)(zhi)行(xing)(xing)(xing)(xing)程(cheng)序(xu)(xu)(xu)啟(qi)動(dong)時(shi)加(jia)載到執(zhi)(zhi)行(xing)(xing)(xing)(xing)程(cheng)序(xu)(xu)(xu)中(zhong),可(ke)以被(bei)多個可(ke)執(zhi)(zhi)行(xing)(xing)(xing)(xing)程(cheng)序(xu)(xu)(xu)共(gong)享使用。使用動(dong)態(tai)(tai)庫(ku)編譯生(sheng)成(cheng)的(de)程(cheng)序(xu)(xu)(xu)相對較小(xiao),但運行(xing)(xing)(xing)(xing)時(shi)需要庫(ku)文(wen)件(jian)支持,如果機(ji)器(qi)里沒有這些庫(ku)文(wen)件(jian)就(jiu)(jiu)不能運行(xing)(xing)(xing)(xing)。

3 如何使用(yong)動態庫?

動態庫(ku)也(ye)叫(jiao)共(gong)享(xiang)庫(ku),如果(guo)在(zai)程(cheng)序連(lian)接時(shi)使用(yong)共(gong)享(xiang)庫(ku),就(jiu)必須在(zai)運行時(shi)找(zhao)到共(gong)享(xiang)庫(ku)的位(wei)置。Linux的可(ke)執(zhi)行程(cheng)序在(zai)執(zhi)行的時(shi)候(hou)默認(ren)(ren)是先搜(sou)索(suo)/lib和(he)/usr/lib這兩個目(mu)錄,然后按照/etc/ld.so.conf里面的配置搜(sou)索(suo)絕對路(lu)(lu)徑(jing)(jing)(jing)。同時(shi),linux也(ye)提供了(le)環(huan)境變(bian)量(liang)LD_LIBRARY_PATH供用(yong)戶選擇使用(yong),用(yong)戶可(ke)以(yi)通過它(ta)來(lai)查(cha)找(zhao)默認(ren)(ren)路(lu)(lu)徑(jing)(jing)(jing)之(zhi)外(wai)的其他路(lu)(lu)徑(jing)(jing)(jing),如要查(cha)找(zhao)/work/lib路(lu)(lu)徑(jing)(jing)(jing),你(ni)可(ke)以(yi)在(zai)/etc/rc.d/rc.local或其他系統啟動后即可(ke)執(zhi)行到的腳(jiao)本文件中添(tian)加(jia)如下語(yu)句:LD_LIBRARY_PATH=/work/lib:$(LD_LIBRARY_PATH)。并且(qie)LD_LIBRARY_PATH路(lu)(lu)徑(jing)(jing)(jing)優先于(yu)系統默認(ren)(ren)路(lu)(lu)徑(jing)(jing)(jing)之(zhi)前(qian)查(cha)找(zhao)。

不過LD_LIBRARY_PATH的(de)(de)設(she)定作用是(shi)全局的(de)(de),過多的(de)(de)使用可能會影響(xiang)到其他應用程序的(de)(de)運行,所(suo)以多用在調試(shi)。

4 庫的連接路(lu)經和運行路(lu)經

現代連接(jie)器在處理(li)動態庫(ku)(ku)時(shi)將鏈接(jie)時(shi)路(lu)徑(Link-time path)和(he)運行時(shi)路(lu)徑(Run-time path)分(fen)開,用(yong)戶可以通過(guo)(guo)-L指定(ding)連接(jie)時(shi)庫(ku)(ku)的路(lu)徑,通過(guo)(guo)-R(或-rpath)指定(ding)程(cheng)序運行時(shi)庫(ku)(ku)的路(lu)徑,大大提高了庫(ku)(ku)應用(yong)的靈活(huo)性。比(bi)如我(wo)們(men)做嵌(qian)入(ru)式移植(zhi)時(shi)#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下(xia)是交叉(cha)編譯好的zlib庫(ku)(ku)),將target編譯好后(hou)我(wo)們(men)只要把zlib庫(ku)(ku)拷(kao)貝到開發板的系統(tong)默認路(lu)徑下(xia)即(ji)可。或者通過(guo)(guo)- rpath(或-R )、LD_LIBRARY_PATH指定(ding)查(cha)找路(lu)徑

5 動態庫的加(jia)載使(shi)用?

基本上(shang)每個linux程序(xu)都至少會用一個動態庫,查看某(mou)個程序(xu)使用了那(nei)些動態庫,使用命令ldd查看

如:#ldd /bin/ls (查看(kan)系統中ls用到的(de)動態庫(ku))

#ldd main (查看自定義main用到的(de)動(dong)態庫(ku))

#ldd -u main(查看(kan)自(zi)定(ding)義main中無(wu)用的動態庫)

#strace ./main(查看程序啟動時加載的所有(you)動態庫)

Linux程序啟動時(shi)加(jia)載的(de)(de)庫有默認的(de)(de)庫也有顯式手(shou)動連(lian)接的(de)(de)庫

1 默認:編(bian)譯代(dai)碼時不手動連接(jie)額外庫(ku),那么在代(dai)碼中使用到庫(ku)函數時會(hui)在運行時自動加載(zai)連接(jie)需要(yao)的(de)庫(ku)。

#gcc -o main main.c

#ldd main

linux-vdso.so.1 => (0x00007fffa1b6d000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff4fde52000)

/lib64/ld-linux-x86-64.so.2 (0x00007ff4fe230000)

2 手動:編譯代碼(ma)時(shi)(shi)手動添加(jia)(jia)額外的(de)(de)(de)庫,那么(me)在程(cheng)序(xu)運(yun)行(xing)時(shi)(shi),既要加(jia)(jia)載默認(ren)的(de)(de)(de)庫,還要加(jia)(jia)載手動添加(jia)(jia)的(de)(de)(de)庫。加(jia)(jia)載的(de)(de)(de)庫多了,會影(ying)響程(cheng)序(xu)啟動的(de)(de)(de)速度。

#gcc -o main1 -lm -lrt main.c (編譯(yi)時(shi)手動連接數學庫、線程(cheng)庫)

#ldd main1

linux-vdso.so.1 => (0x00007fff88770000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f993a0cc000)

/lib64/ld-linux-x86-64.so.2 (0x00007f993a4aa000)

#strace ./main1

從(cong)程(cheng)序(xu)(xu)運行中可以看出main1運行時即加(jia)載(zai)了默認庫(ku)(ku),也(ye)加(jia)載(zai)了手動指定的(de)庫(ku)(ku)(在(zai)此(ci)手動指定的(de)數(shu)學庫(ku)(ku)、線程(cheng)庫(ku)(ku)是代碼不需要的(de),但(dan)在(zai)程(cheng)序(xu)(xu)運行時也(ye)加(jia)載(zai)了),會影響整個程(cheng)序(xu)(xu)的(de)加(jia)載(zai)速度。

大(da)家知(zhi)(zhi)不知(zhi)(zhi)道linux從程序(program或(huo)對象)變成進程(process或(huo)進程),要經過哪些步驟呢,簡單的說分三步:

1、fork進程,在內核創建進程相(xiang)關內核項,加載進程可執行(xing)文件;

2、查找(zhao)依賴的so,一一加載映(ying)射虛擬地址

3、初始化程(cheng)序變量。

可以看到(dao),第二步中dll依賴(lai)越多,進程(cheng)啟動越慢,并且發布程(cheng)序的(de)時候,有(you)這些鏈(lian)接但沒有(you)使用的(de)so,同樣(yang)要一起跟著發布,否則進程(cheng)啟動時候,會(hui)失敗,找(zhao)不到(dao)對應的(de)so。所以我們不能像上(shang)面(mian)那樣(yang),把一些毫無(wu)意義的(de)so鏈(lian)接進來(lai),浪費資源。

6 關于(yu)Linux程序連接so有兩種方式:隱式和(he)顯示(shi)

所謂顯(xian)示就是(shi)(shi)(shi)程(cheng)(cheng)(cheng)序(xu)主(zhu)動調(diao)(diao)用(yong)(yong)(yong)dlopen打開(kai)相(xiang)關so;首(shou)先(xian),dlopen的(de)(de)so使(shi)用(yong)(yong)(yong)ldd是(shi)(shi)(shi)查看不(bu)到的(de)(de)。其次,使(shi)用(yong)(yong)(yong)dlopen打開(kai)的(de)(de)so并不(bu)是(shi)(shi)(shi)在進程(cheng)(cheng)(cheng)啟(qi)動時候(hou)(hou)加載(zai)映射(she)的(de)(de),而(er)是(shi)(shi)(shi)當進程(cheng)(cheng)(cheng)運(yun)(yun)行(xing)到調(diao)(diao)用(yong)(yong)(yong)dlopen代(dai)碼地方才加載(zai)該(gai)(gai)so,也就是(shi)(shi)(shi)說(shuo),如(ru)果每個進程(cheng)(cheng)(cheng)顯(xian)示鏈接a.so;但是(shi)(shi)(shi)如(ru)果發(fa)(fa)布該(gai)(gai)程(cheng)(cheng)(cheng)序(xu)時候(hou)(hou)忘記附帶發(fa)(fa)布該(gai)(gai)a.so,程(cheng)(cheng)(cheng)序(xu)仍然能(neng)夠正常啟(qi)動,甚(shen)至(zhi)如(ru)果運(yun)(yun)行(xing)邏輯沒(mei)有(you)觸發(fa)(fa)運(yun)(yun)行(xing)到調(diao)(diao)用(yong)(yong)(yong)dlopen函數代(dai)碼地方。該(gai)(gai)程(cheng)(cheng)(cheng)序(xu)還(huan)能(neng)正常運(yun)(yun)行(xing),即使(shi)沒(mei)有(you)a.so. 既然顯(xian)示加載(zai)這么(me)多(duo)優點(dian),那么(me)為什么(me)實際(ji)生產中很(hen)少碼農使(shi)用(yong)(yong)(yong)它(ta)呢, 主(zhu)要(yao)原因還(huan)是(shi)(shi)(shi)起使(shi)用(yong)(yong)(yong)不(bu)是(shi)(shi)(shi)很(hen)方便(bian),需(xu)要(yao)開(kai)發(fa)(fa)人員多(duo)寫不(bu)少代(dai)碼。所以不(bu)被大多(duo)數碼農使(shi)用(yong)(yong)(yong),還(huan)有(you)一個重要(yao)原因應該(gai)(gai)是(shi)(shi)(shi)能(neng)提前(qian)發(fa)(fa)現(xian)錯誤(wu),在部署的(de)(de)時候(hou)(hou)就能(neng)發(fa)(fa)現(xian)缺少哪些so,而(er)不(bu)是(shi)(shi)(shi)等(deng)到實際(ji)上限運(yun)(yun)行(xing)的(de)(de)時候(hou)(hou)才發(fa)(fa)現(xian)缺東少西。

上一篇:嵌入式學習:開源與閉源

下一篇:linuxtrap腳本信號捕獲命令的使用

熱點文章推薦
華清學員就業榜單
高薪學員經驗分(fen)享
熱點(dian)新聞推薦
前臺專線:010-82525158 企(qi)業培訓洽(qia)談(tan)專(zhuan)線:010-82525379 院校合作洽談專(zhuan)線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部