linux下動態庫中的soname


soname( Short for shared object name)

其是應用程序加載dll 時候,其尋找共享庫用的文件名。其格式為

lib + math+.so + ( major version number)

其只包含major version number,換句話說,也就是只要其接口沒有變,應用程序都可以用,不管你其后minor build version or build version。

簡單來說:

-Wl,-soname -Wl 告訴編譯器將后面的參數傳遞到連接器。而 -soname 指定了
共享庫的 soname這個soname的存在是為了兼容方便。
比如:
    有一個程序ap1,以及一個庫libtest.so.1
    ap1啟動的時候需要libtest.so.1
    如果鏈接的時候直接把libtest.so.1傳給了ap1,那么將來庫升級為libtest.so.2的時候,ap1仍然只能使用libtest.so.1的代碼,並不能得到升級的好處。而如果指定了 soname為libtest.so,那么ap1啟動的時候將查找的就是libtest.so而不是其在被鏈接時實際使用的庫libtest.so.1這個文件名。
    在開始時我們建立一個鏈接:ln -sf libtest.so.1 libtest.so
    而在庫升級后,我們重新:ln -sf libtest.so.2 libtest.so即可,這樣ap1不需要任何變動就能享受升級后的庫的特性了。而libtest.so.1,libtest.so.2可以同時存在於系統內,不必非得把libtest.so.2的名字改成libtest.so.1

real name 共享庫本身的文件名

lib+庫名+so.主版本號.小版本號.build號

主版本號,代表當前動態庫的版本,如果動態庫的接口有變 化,那么這個版本號就要加1;后面的兩個版本號(小版本號 和 build 號)是告訴你詳細的信息,比如為一個hot-fix 而生成的一個版本,其小版本號加1,build號也應有變化。 這個文件名包含共享庫的代碼。

 

link name 共享庫的連接名

lib + math +.so
link name,顧名思義,就是在編譯過程,link 階段用的文件名。 其將soname 和real name 關聯起來。

在共享庫編譯過程中,連接(link) 階段,編譯器將生成一個共享庫及real name,同時將共享庫的soname,寫在共享庫文件里的文件頭里面。當應用程序加載時就會通過soname 去給定的路徑下尋找該共享庫

可以用命令 readelf -d sharelibrary 去查看。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM