日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Ubuntu Linux---GNU libc庫( 二 )


- 當(dāng)對共享庫提供的接口做了與以前版本不兼容的改變時,需要增大大版本號 。這個大的改變意味著依賴該庫先前大版本的應(yīng)用程序需要作相應(yīng)修改才能使用大版本更新后的庫 。
- 當(dāng)共享庫增加了新的接口同時也保留了原來的接口時,增大小版本號 。
- 當(dāng)作了與以前兼容的修改又沒有增加新接口時,增大發(fā)布號 。這通常是對一些實(shí)現(xiàn)做了改動以提高性能和擴(kuò)展性 。
要在Linux上創(chuàng)建共享庫,使用-shared編譯參數(shù);該參數(shù)告訴GNU ld創(chuàng)建一個共享庫而不是應(yīng)用程序 。下面是這樣一個例子:
(代碼)p58 最后一行 $ gcc o libfoo.so shared fpic foo.c
上一頁;;[1];[2][3];[4];[5];下一頁
3.4 庫版本化
在共享庫和應(yīng)用程序之間維護(hù)二進(jìn)制級的兼容性或ABI是很重要的 。共享庫的ABI是應(yīng)用程序依賴的運(yùn)行時接口;如果每次發(fā)布時共享庫的ABI都與以前的兼容,那么在其中某一個版本的共享庫上編譯的應(yīng)用程序不需要任何改動就可以在后續(xù)版本上運(yùn)行 。庫版本化就是Linux以及同期的其他操作系統(tǒng)實(shí)現(xiàn)二進(jìn)制兼容性的方法 。
我們以前移植過的一些應(yīng)用程序需要庫版本化的支持 。各UNIX平臺也都實(shí)現(xiàn)了庫版本化,但實(shí)現(xiàn)的方法不盡相同 。Linux提供了兩種不同的技術(shù)來實(shí)現(xiàn)庫版本化:外部庫版本化和符號版本化 。
3.4.1 外部庫版本化
鏈接過程中,鏈接器(ld)會查找以.so結(jié)尾的共享庫文件 。以.so結(jié)尾的庫文件叫鏈接器名稱,這是由他們在Linux上的使用方式?jīng)Q定的 。當(dāng)編譯一個依賴某一共享庫的應(yīng)用程序時,僅僅是該共享庫的soname(不是共享庫的文件名)作為依賴關(guān)系被記錄在應(yīng)用程序的二進(jìn)制代碼中 。運(yùn)行時鏈接器就是使用共享庫的soname來查找和裝載該庫的 。共享庫的soname只包含有大版本號(例如,libfoo.so.1)
當(dāng)修改后的共享庫與以前版本不兼容時,新的共享庫必須有一個新的外部版本名稱 。也就是說,該庫的soname必須改變 。這些不兼容的修改包括:刪除一個符號,去掉某函數(shù)的一個參數(shù),改變了某函數(shù)的語義屬性以致與以前的定義不再一致并且與老版本二進(jìn)制不兼容等等 。我們來看下面的例子 。(見pdf附件 341.pdf)
 3.4.2 符號版本化
就像前面所提到的,當(dāng)對共享庫所作的修改能夠向前兼容時,我們只增大小版本號 。這種修改包括增加一些新的接口同時又不改變已有的接口 。但是,即使只做這種小版本的修改,也會出現(xiàn)一個很重要的問題:一個在某一小版本的共享庫上編譯的應(yīng)用程序并不一定能夠在以前小版本的庫上運(yùn)行 。這是因?yàn)樵搼?yīng)用程序可能使用了新增加的、以前小版本的庫中沒有的接口 。為了解決這個問題,引入了符號版本化 。符號版本化允許共享庫記錄下每個小版本都新增了什么內(nèi)容 。
在Linux上,GNU ld可以使用-version-script連接器選項(xiàng)來創(chuàng)建符號版本化的共享庫 。編譯器選項(xiàng)-Wl,--version-script=mapfile告訴鏈接器哪些符號要從生成的共享庫中輸出出來 。每個符號分屬global(被輸出)和local(不被輸出)兩類中的一種 。來看下面的例子 。foo.c包含一個函數(shù)foo1,該文件用來創(chuàng)建1.1版本的共享庫 。(見附件 示例代碼.pdf)
可以看到,這次main只引用了版本化庫的LX_1.1 。
GNU ld還允許在定義符號的源文件中把符號綁定到某一版本中,而不僅僅是在腳本文件中指定 。另外,GNU ld還允許同一函數(shù)的多個版本出現(xiàn)在同一個共享庫中 。更多詳細(xì)信息,請參考GNU ld手冊(注釋13)和Ulrich Drepper的文章“How to Write Shared Libraries 。
從2.1版本開始,glibc就已經(jīng)實(shí)現(xiàn)了符號版本化 。符號版本化同時也是LSB規(guī)范1.2及更高版本的一部分 。

推薦閱讀