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的存在是為了兼容方便。
共享庫的 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 去查看。