青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

/********************************************\
|????歡迎轉(zhuǎn)載, 但請保留作者姓名和原文鏈接, 祝您進(jìn)步并共勉!???? |
\********************************************/


Linux靜態(tài)、共享和動態(tài)庫之編程

作者: Jerry Cat
時間: 2006/04/21
鏈接: http://m.shnenglu.com/jerysun0818/archive/2006/04/22/6065.html

一.庫的分類
??? 有兩種說法, 如果熟悉WIN平臺下的DLL, 相信不難理解:

??? 庫可以有三種使用的形式:靜態(tài)、共享和動態(tài).靜態(tài)庫的代碼在編譯時就已連接到開發(fā)人員開發(fā)的應(yīng)用程序中, 而共享庫只是在程序開始運(yùn)行時才載入, 在編譯時, 只是簡單地指定需要使用的庫函數(shù).動態(tài)庫則是共享庫的另一種變化形式.動態(tài)庫也是在程序運(yùn)行時載入, 但與共享庫不同的是, 使用的庫函數(shù)不是在程序運(yùn)行開始, 而是在程序中的語句需要使用該函數(shù)時才載入.動態(tài)庫可以在程序運(yùn)行期間釋放動態(tài)庫所占用的內(nèi)存, 騰出空間供其它程序使用.由于共享庫和動態(tài)庫并沒有在程序中包括庫函數(shù)的內(nèi)容, 只是包含了對庫函數(shù)的引用, 因此代碼的規(guī)模比較小.

??? Linux下的庫文件分為共享庫和靜態(tài)庫兩大類, 它們兩者的差別僅在程序執(zhí)行時所需的代碼是在運(yùn)行時動態(tài)加載的, 還是在編譯時靜態(tài)加載的.區(qū)分庫類型最好的方法是看它們的文件后綴, 通常共享庫以.so(Shared Object的縮寫)結(jié)尾, 靜態(tài)鏈接庫通常以.a結(jié)尾(Archive的縮寫).在終端缺省情況下, 共享庫通常為綠色, 而靜態(tài)庫為黑色.

???? 已經(jīng)開發(fā)的大多數(shù)庫都采取共享庫的方式.ELF格式的可執(zhí)行文件使得共享庫能夠比較容易地實(shí)現(xiàn), 當(dāng)然使用舊的a.out模式也可以實(shí)現(xiàn)庫的共享.Linux系統(tǒng)中目前可執(zhí)行文件的標(biāo)準(zhǔn)格式為ELF格式.

  .a的是為了支持較老的a.out格式的可執(zhí)行文件的
  .so的是支持elf格式的可執(zhí)行文件的庫.

 ? .a是靜態(tài)庫文件, 可以用ar 命令生成.
  .so是動態(tài)庫文件, 編譯時加上指定的選項(xiàng)即可生成, 具體選項(xiàng)看相應(yīng)的系統(tǒng)文檔了.

二.庫的命名規(guī)則
??? GNU庫的使用必須遵守Library GNU Public License(LGPL許可協(xié)議).該協(xié)議與GNU許可協(xié)議略有不同, 開發(fā)人員可以免費(fèi)使用GNU庫進(jìn)行軟件開發(fā), 但必須保證向用戶提供所用的庫函數(shù)的源代碼.

  系統(tǒng)中可用的庫都存放在/usr/lib和/lib目錄中.庫文件名由前綴lib和庫名以及后綴組成.根據(jù)庫的類型不同, 后綴名也不一樣.共享庫的后綴名由.so和版本號組成, 靜態(tài)庫的后綴名為.a.采用舊的a.out格式的共享庫的后綴名為.sa.
  libname.so.major.minor
  libname.a

  這里的name可以是任何字符串, 用來唯一標(biāo)識某個庫.該字符串可以是一個單字、幾個字符、甚至一個字母.數(shù)學(xué)共享庫的庫名為libm.so.5, 這里的標(biāo)識字符為m, 版本號為5.libm.a則是靜態(tài)數(shù)學(xué)庫.X-Windows庫名為libX11.so.6, 這里使用X11作為庫的標(biāo)識, 版本號為6.

三.庫操作命令

?? Linux庫操作可以使用命令完成, 目前常用的命令是ldd和ldconfig.

?? 1.ldd
?ldd是Library Dependency Display縮寫, 它的作用是顯示一個可執(zhí)行程序必須使用的共享庫.

?$ ldd /usr/bin/mesg
?libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7eaf000)
?/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb7feb000)

?? 2.ldconfig
?庫安裝到系統(tǒng)以后, 為了讓動態(tài)鏈接庫為系統(tǒng)所認(rèn)識及共享, 就需要運(yùn)行l(wèi)dconfig.ldconfig命令的用途, 主要是在默認(rèn)搜尋目錄(/lib和/usr/lib)以及動態(tài)庫配置文件/etc/ld.so.conf內(nèi)所列的目錄下, 搜索出可共享的動態(tài)鏈接庫(格式如lib*.so*), 進(jìn)而創(chuàng)建出動態(tài)裝入程序(ld.so)所需的連接和緩存文件.緩存文件默認(rèn)為/etc/ld.so.cache, 此文件保存已排好序的動態(tài)鏈接庫名字列表, ldconfig通常在系統(tǒng)啟動時運(yùn)行, 而當(dāng)用戶安裝了一個新的動態(tài)鏈接庫時,就需要手工運(yùn)行這個命令.

???? (1)命令格式
?ldconfig [選項(xiàng)] [libs]

???? (2)主要選項(xiàng)
?-v或--verbose ldconfig將顯示正在掃描的目錄、搜索到的動態(tài)鏈接庫, 以及它所創(chuàng)建的連接的名字.

?-f CONF 指定動態(tài)鏈接庫的配置文件為CONF, 系統(tǒng)默認(rèn)為/etc/ld.so.conf.

?-C CACHE 指定生成的緩存文件為CACHE, 系統(tǒng)默認(rèn)的是/etc/ld.so.cache,文件存放已排好序的可共享的動態(tài)鏈接庫的列表.

?-p或--print-cache 讓ldconfig打印出當(dāng)前緩存文件所保存的所有共享庫的名字.

?-r ROOT 改變應(yīng)用程序的根目錄為ROOT.

?-n ldconfig僅掃描命令行指定的目錄, 不掃描默認(rèn)目錄(/lib、/usr/lib),也不掃描配置文件/etc/ld.so.conf所列的目錄.

?運(yùn)行沒有選項(xiàng)的ldconfig命令時, 用于更新高速緩沖文件.這個命令主要用于高速緩沖DNS服務(wù)器(Caching DNS Server).高速緩沖DNS服務(wù)器的原理是提供查詢的歷史記錄, 并且利用這些記錄來提高查詢的效率.

?當(dāng)某個查詢是第一次被發(fā)送到高速緩沖DNS服務(wù)器時, 高速緩沖DNS服務(wù)器就將此查詢的整個過程記錄下來, 在一定的時期內(nèi)用它來回答所有相同的查詢, 從而減少整個DNS系統(tǒng)的負(fù)擔(dān)并且提高查詢速度.

四.庫的升級

?Linux系統(tǒng)軟件更新很快, 新的核心幾乎每幾個星期就公布一次, 其它軟件的更新也是非常頻繁.多數(shù)情況下, 盲目跟隨潮流的升級并不必要, 如果確實(shí)需要新版本的特性時再升級.換句話說, 不要為了升級而升級.Linux系統(tǒng)中多數(shù)軟件都是用共享庫來編譯的, 其中包含了在不同程序之間共享的公用子例程.

在運(yùn)行某個程序時, 如果看到如下信息:“Incompatible library version.”則表明需要將該庫升級到程序所需要的版本.庫是向下兼容的, 也就是說, 用老版本庫編譯的程序可以在新安裝的版本庫上運(yùn)行, 反之則不行.

Linux庫函數(shù)的升級是一項(xiàng)重要的工作, 往往與其它軟件包的升級有一定關(guān)聯(lián)作用, 所以操作前一定要備份文件.下面看一下如何把Glibc 2.2.4.13升級至2.3.2版本, 其過程如下:

? 1.下載.gz壓縮文件并解壓

在GUN C網(wǎng)站下載的四個.gz壓縮文件, 解壓至一臨時目錄中:
cd /usr/caolinux
tar xzvf glibc-2.3.2.tar.gz
cd glibc-2.3.2
tar xzvf ../glibc-linuxthreads-2.3.2.tar.gz
tar xzvf ../glibc-crypt-2.3.2.tar.gz
tar xzvf ../glibc-localedata-2.3.2.tar.gz

? 2.建立庫函數(shù)的安裝目錄
mkdir /usr/higlibc
cd /usr/higlibc

?? 3.建立編譯目錄
mkdir cao
cd cao
./configure --enable-add-ons=linuxthreads,crypt,localedata -prefix=/usr/higlibc

? 4.編譯與安裝
make
make check
make install

? 5.改變數(shù)據(jù)庫的鏈接
ln -s /usr/higlibc/lib/ld-linux.so.2 /lib/ld-linux.so.2

然后, 修改/etc/ld.so.conf, 加入一行/usr/higlibc/lib, 執(zhí)行下面代碼:
ldconfig -v

更新/etc/ld.so.cache的內(nèi)容, 列出每個庫的版本號, 掃描目錄和所要創(chuàng)建及更新的鏈接.

?6.更改GCC設(shè)置

cd /usr/lib/gcc-lib
cp -r i386-redhat-linux higlibc

?7.更新符號鏈接
cd /usr/higlibc/include
ln -s /usr/src/linux/include/linux
ln -s /usr/src/linux/include/asm
ln -s /usr/X11R6/include/X11

8.測試并完成

五.高級共享庫特性
?1. soname

共享庫的一個非常重要的, 也是非常難的概念是 soname——簡寫共享目標(biāo)名(short for shared object name).這是一個為共享庫(.so)文件而內(nèi)嵌在控制數(shù)據(jù)中的名字.如前面提到的, 每一個程序都有一個需要使用的庫的清單.這個清單的內(nèi)容是一系列庫的 soname, 如同 ldd 顯示的那樣, 共享庫裝載器必須找到這個清單.

soname 的關(guān)鍵功能是它提供了兼容性的標(biāo)準(zhǔn).當(dāng)要升級系統(tǒng)中的一個庫時, 并且新庫的 soname 和老的庫的 soname 一樣, 用舊庫連接生成的程序, 使用新的庫依然能正常運(yùn)行.這個特性使得在 Linux 下, 升級使用共享庫的程序和定位錯誤變得十分容易.

在 Linux 中, 應(yīng)用程序通過使用 soname, 來指定所希望庫的版本.庫作者也可以通過保留或者改變 soname 來聲明, 哪些版本是相互兼容的, 這使得程序員擺脫了共享庫版本沖突問題的困擾.

查看/usr/local/lib 目錄, 分析 MiniGUI 的共享庫文件之間的關(guān)系

2. 共享庫裝載器

當(dāng)程序被調(diào)用的時候, Linux 共享庫裝載器(也被稱為動態(tài)連接器)也自動被調(diào)用.它的作用是保證程序所需要的所有適當(dāng)版本的庫都被調(diào)入內(nèi)存.共享庫裝載器名字是 ld.so 或者是 ld-linux.so, 這取決于 Linux libc 的版本, 它必須使用一點(diǎn)外部交互, 才能完成自己的工作.然而它接受在環(huán)境變量和配置文件中的配置信息.

文件 /etc/ld.so.conf 定義了標(biāo)準(zhǔn)系統(tǒng)庫的路徑.共享庫裝載器把它作為搜索路徑.為了改變這個設(shè)置, 必須以 root 身份運(yùn)行 ldconfig 工具.這將更新 /etc/ls.so.cache 文件, 這個文件其實(shí)是裝載器內(nèi)部使用的文件之一.

3. 使用 dlopen

另外一個強(qiáng)大的庫函數(shù)是 dlopen().該函數(shù)將打開一個新庫, 并把它裝入內(nèi)存.該函數(shù)主要用來加載庫中的符號, 這些符號在編譯的時候是不知道的.比如 Apache Web 服務(wù)器利用這個函數(shù)在運(yùn)行過程中加載模塊, 這為它提供了額外的能力.一個配置文件控制了加載模塊的過程.這種機(jī)制使得在系統(tǒng)中添加或者刪除一個模塊時, 都不需要重新編譯了.

可以在自己的程序中使用 dlopen().dlopen() 在 dlfcn.h 中定義, 并在 dl 庫中實(shí)現(xiàn).它需要兩個參數(shù):一個文件名和一個標(biāo)志.文件名可以是我們學(xué)習(xí)過的庫中的 soname.標(biāo)志指明是否立刻計(jì)算庫的依賴性.如果設(shè)置為 RTLD_NOW 的話, 則立刻計(jì)算;如果設(shè)置的是 RTLD_LAZY, 則在需要的時候才計(jì)算.另外, 可以指定 RTLD_GLOBAL, 它使得那些在以后才加載的庫可以獲得其中的符號.

當(dāng)庫被裝入后, 可以把 dlopen() 返回的句柄作為給 dlsym() 的第一個參數(shù), 以獲得符號在庫中的地址.使用這個地址, 就可以獲得庫中特定函數(shù)的指針, 并且調(diào)用裝載庫中的相應(yīng)函數(shù).

六、LINUX下動態(tài)鏈接庫的使用
重要的dlfcn.h頭文件
LINUX下使用動態(tài)鏈接庫, 源程序需要包含dlfcn.h頭文件, 此文件定義了調(diào)用動態(tài)鏈接庫的函數(shù)的原型.下面詳細(xì)說明一下這些函數(shù).
1. dlerror
原型為: const char *dlerror(void);
當(dāng)動態(tài)鏈接庫操作函數(shù)執(zhí)行失敗時, dlerror可以返回出錯信息, 返回值為NULL時表示操作函數(shù)執(zhí)行成功.
2. dlopen
原型為: void *dlopen (const char *filename, int flag);
dlopen用于打開指定名字(filename)的動態(tài)鏈接庫, 并返回操作句柄.
filename: 如果名字不以/開頭, 則非絕對路徑名, 將按下列先后順序查找該文件.
(1) 用戶環(huán)境變量中的LD_LIBRARY值;
(2) 動態(tài)鏈接緩沖文件/etc/ld.so.cache
(3) 目錄/lib, /usr/lib
flag表示在什么時候解決未定義的符號(調(diào)用).取值有兩個:
1) RTLD_LAZY : 表明在動態(tài)鏈接庫的函數(shù)代碼執(zhí)行時解決.
2) RTLD_NOW : 表明在dlopen返回前就解決所有未定義的符號, 一旦未解決, dlopen將返回錯誤.
dlopen調(diào)用失敗時, 將返回NULL值, 否則返回的是操作句柄.
3. dlsym : 取函數(shù)執(zhí)行地址
原型為: void *dlsym(void *handle, char *symbol);
dlsym根據(jù)動態(tài)鏈接庫操作句柄(handle)與符號(symbol), 返回符號對應(yīng)的函數(shù)的執(zhí)行代碼地址.由此地址, 可以帶參數(shù)執(zhí)行相應(yīng)的函數(shù).
如程序代碼: void (*add)(int x,int y); /* 說明一下要調(diào)用的動態(tài)函數(shù)add */
add=dlsym("xxx.so","add"); /* 打開xxx.so共享庫,取add函數(shù)地址 */
add(89,369); /* 帶兩個參數(shù)89和369調(diào)用add函數(shù) */
4. dlclose : 關(guān)閉動態(tài)鏈接庫
原型為: int dlclose (void *handle);
dlclose用于關(guān)閉指定句柄的動態(tài)鏈接庫, 只有當(dāng)此動態(tài)鏈接庫的使用計(jì)數(shù)為0時,才會真正被系統(tǒng)卸載.

posted on 2006-04-22 01:32 Jerry Cat 閱讀(3444) 評論(1)  編輯 收藏 引用

FeedBack:
# re: Linux靜態(tài)、共享和動態(tài)庫之編程
2009-08-25 19:46 | Haifeng
精辟  回復(fù)  更多評論
  

<2006年4月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用鏈接

留言簿(7)

隨筆檔案

最新隨筆

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美国产视频一区二区| 国产美女搞久久| 亚洲视频每日更新| 亚洲人体大胆视频| 欧美激情偷拍| 亚洲美女免费精品视频在线观看| 亚洲国产成人在线播放| 日韩视频在线免费| 亚洲线精品一区二区三区八戒| 99在线精品视频在线观看| 亚洲小说欧美另类婷婷| 欧美亚洲一区二区三区| 久久人人爽人人爽| 欧美乱人伦中文字幕在线| 欧美性开放视频| 国产亚洲欧美日韩精品| 亚洲国产天堂久久国产91| 亚洲深夜福利视频| 久久久久九九视频| 亚洲日本aⅴ片在线观看香蕉| 宅男噜噜噜66一区二区| 亚洲少妇诱惑| 久久视频免费观看| 欧美激情视频网站| 日韩亚洲欧美中文三级| 欧美在线|欧美| 欧美激情中文字幕乱码免费| 国产精品人人爽人人做我的可爱| 亚洲第一视频| 亚洲专区在线| 欧美国产一区二区在线观看 | 亚洲精品国产精品国产自| 亚洲视频综合| 免费一级欧美片在线播放| 欧美日韩国产不卡在线看| 国模私拍一区二区三区| 亚洲一区二区三区高清| 欧美**人妖| 性做久久久久久久久| 欧美日韩国产一区二区三区地区 | 亚洲一区二区精品视频| 裸体丰满少妇做受久久99精品| 国产精品入口尤物| 一本一道久久综合狠狠老精东影业 | 国产精品永久免费在线| 在线日韩中文| 久久精品国产第一区二区三区最新章节 | 久久久久久亚洲精品不卡4k岛国| 欧美性猛交视频| 亚洲免费观看视频| 欧美成人国产va精品日本一级| 亚洲欧美国产高清| 欧美高清免费| 亚洲国产精品一区二区第一页| 亚洲欧美综合一区| 亚洲毛片在线免费观看| 欧美激情在线免费观看| 伊人男人综合视频网| 久久精品国产一区二区三区| 亚洲人成7777| 欧美mv日韩mv国产网站| 亚洲欧美中文另类| 国产精品mv在线观看| 亚洲在线国产日韩欧美| 99精品视频免费观看视频| 欧美激情国产高清| 美国十次成人| 亚洲毛片一区| 99精品热视频只有精品10| 欧美性做爰猛烈叫床潮| 亚洲一区图片| 午夜视频一区| 极品尤物一区二区三区| 你懂的国产精品| 欧美国产日产韩国视频| 国产精品99久久久久久久女警| 一本一道久久综合狠狠老精东影业| 国产精品a级| 久久久久久久久久久久久久一区| 欧美制服丝袜第一页| 亚洲国产99| 中文网丁香综合网| 中文亚洲欧美| 狠狠色噜噜狠狠狠狠色吗综合| 久久久久久久成人| 欧美jizz19性欧美| 日韩亚洲欧美精品| 亚洲主播在线播放| 黄色小说综合网站| 欧美大胆a视频| 欧美精品一区二区三区久久久竹菊| 亚洲国产欧美在线人成| 最新日韩欧美| 国产精品乱码妇女bbbb| 性欧美激情精品| 久久九九国产| 一区二区欧美日韩视频| 亚洲久色影视| 尤物精品国产第一福利三区| 欧美激情在线狂野欧美精品| 欧美精品三区| 亚欧成人在线| 欧美高清视频一二三区| 欧美亚洲一级| 美国成人毛片| 久久久精品日韩| 欧美成人免费播放| 欧美在线观看视频一区二区| 噜噜噜噜噜久久久久久91 | 久久米奇亚洲| 一区二区三区四区精品| 欧美一区二区三区电影在线观看| 日韩视频免费观看高清完整版| 亚洲欧美国产一区二区三区| 亚洲精品乱码久久久久久久久| 午夜免费日韩视频| 亚洲一区尤物| 欧美大色视频| 欧美1区视频| 国产日产欧美精品| 亚洲图片激情小说| 日韩亚洲精品在线| 免费成人性网站| 老司机成人网| 国产亚洲欧美一区二区| 在线综合亚洲| 在线一区二区三区四区| 美女露胸一区二区三区| 亚洲三级视频| 亚洲国产精品福利| 欧美久久久久| 久久成人免费网| 亚洲一区中文| 亚洲精品在线观| 久久网站热最新地址| 亚洲一区二区三区免费在线观看| 亚洲理论在线观看| 韩日在线一区| 国产精品久久久久91| 国产精品久久久久三级| 一区二区av在线| 亚洲经典自拍| 蜜臀久久99精品久久久画质超高清| 久久精品伊人| 国产主播在线一区| 久久精品一区二区三区中文字幕| 久久九九国产精品| 国外成人免费视频| 久久久久一本一区二区青青蜜月| 久久精品视频免费观看| 国产欧美午夜| 久久精品国产一区二区三区| 狂野欧美激情性xxxx欧美| 黄色成人av在线| 麻豆91精品| 亚洲精品日韩欧美| 亚洲午夜精品久久久久久app| 国产精品免费在线| 午夜精品在线观看| 快射av在线播放一区| 亚洲裸体俱乐部裸体舞表演av| 久热精品在线| 亚洲高清在线观看一区| 亚洲伊人观看| 欧美成人午夜激情| 亚洲精品一区二区三区不| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 亚洲欧美日韩精品久久亚洲区| 久久蜜桃精品| 一本久道久久综合狠狠爱| 国产精品久久久久国产精品日日| 久久成人av少妇免费| 亚洲精品国久久99热| 亚洲视频一区二区| 伊人男人综合视频网| 欧美午夜www高清视频| 欧美中文字幕| av成人天堂| 男男成人高潮片免费网站| 亚洲一区二区三区免费观看| 一区二区在线免费观看| 欧美三级日本三级少妇99| 久久久久久免费| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 久久精品国产免费| 伊人久久噜噜噜躁狠狠躁| 欧美一区二区三区免费观看 | 欧美寡妇偷汉性猛交| 亚洲欧美日韩精品久久久| 欧美肉体xxxx裸体137大胆| 久久久国产一区二区三区| 亚洲视频网在线直播| 亚洲第一福利视频| 久久国产精品99国产精| 在线亚洲精品| 亚洲精品一区中文| 亚洲高清av在线| 国产一二精品视频| 国产欧美精品国产国产专区| 欧美性开放视频|