- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux共享库版本升级
庫原碼:
//舊庫(有綁定指令)
void foo_v1 int f printf foo_v1\n ; __asm__ .symver foo_v1,foo@@VERSION_1.0 ;
//舊庫(無綁定指令)
void foo int f printf foo_no\n ; //無綁定指令時,後邊的調用就要和這裡的函數名(foo)一致 //新庫
void foo_v1 int f printf __asm__ .symver foo_v1,foo@VERSION_1.0 ;
void foo_v2 int f printf foo_v2-yuanhao\n ; __asm__ .symver foo_v2,foo@@VERSION_1.1 ; //”@@”是指默認函數,必須指定”
說明:舊庫 版本1.0 只有函數foo, 新庫也只有函數foo,只是對foo進行升級,同時實現向前兼容.
編譯舊庫 libfoo.so.1.0 :
libfoo.so.1.0 : foo.c
gcc -shared -fPIC -o libfoo.so.1.0 -Wl,--soname libfoo.so -Wl,--version-script 1.ver foo.c
1.ver內容:
VERSION_1 global: // global 被输出 foo; local: //local 不被输出。它把一些数量的符号限定到本地范围,在共享库的外不可见 *; //如果要升級的函數再local中則會顯示“undefined reference to `foo”
;
說明: 舊庫編譯後,庫名稱為libfoo.so.1.0, soname名稱為: libfoo.so, export函數foo。
有無綁定指令編譯方式一致。
編譯新庫 libfoo.so.1.1 :
libfoo.so.1.1 : foo.c
gcc -Wall -shared -fPIC -o libfoo.so.1.1 -Wl,--soname libfoo.so -Wl,--version-script 2.ver foo.c
2.ver內容
VERSION_1 global: *;
;
VERSION_2 foo;
VERSION_1;
說明: 新庫編譯後,庫名稱為libfoo.so.1.1, soname名稱為: libfoo.so, export函數foo.
注意:foo所在的類型須一致應同在global或者local。 爲了實現向前兼容應將共享庫soname名設一致。
鏈接舊庫
ln -sf libfoo.so.1.0 libfoo.so
gcc -Wall -o v1 -lfoo -L. -Wl,-rpath . main.c //-lfoo 由於命名規則的約定,-l -libfoo.so。
說明:鏈接后輸出可執行文件為v1(可以在黑色自己設定)。
有無綁定指令,連接方式一致。
鏈接新庫
ln -sf libfoo.so.1.1 libfoo.so
gcc -Wall -o v2 -lfoo -L. -Wl,-rpath . main.c //-lfoo 由於命名規則的約定,-l -libfoo.so。
說明:鏈接后輸出可執行文件為v2(可以在紅色自己設定)。
執行結果
兩庫的main是一樣的:
Main.c
#include
void foo int ;
int main void foo 100 ; return 0; 老版(有無綁定指令一致)結果為:
新版的結果為:
若將老版(有無綁定指令)的可執行文件在新編譯的庫中運行得到的結果是新庫中與其結點一致的那個結果(向前兼容性)。
由於老版中的foo綁定在VERSION_1.0上,所以新庫中須有VERSION_1.0才能運行。
若將新編譯連接好的可執行文件v2移到就庫下運行會因為舊庫中缺少“VERSION_1.1”而無法執行。
備註:
代碼中一些重要的參數
-share此选项将尽量使用动态库,所以生成文件比较小,但是需要系统动态库-fPIC?选项产生位置独立的代码。因为在编译的时候,装入内存的地址还不知道。如果不使用这个选项,库文件可能不会正确运行。-Wl选项告诉编译器将后面的参数传递给链接器。
-soname则指定了动态库的sonamesoname的关键功能是它提供了兼容性的标准:当要升级系统中的一个库时,并且新库的soname和老库的soname一样,用旧库链接生成的程序使用新库依然能正常运行。
-Wl,--version-script mapfile 告诉链接器哪些符号要从生成的共享库中输出出来。
ln -*(選項) 源文件 目标文件 -s或--sy
文档评论(0)