Linux環境中動態庫文件(.so文件)的realname,soname和linkname--解釋清楚

realname:

  • 實際等同於庫文件的filename,是在庫文件生成時就被指定的,如:gcc -shared -o $(realname) dependence flags
  • realname的一般格式爲 lib$(name).so.$(major).$(minor).$(revision),$(name)是動態庫的名字,$(major).$(minor).$(revision)分別表示主版本號,子版本號和修正版本號

soname:

  • 在庫文件生成時被指定,如:gcc -shared -o $(realname) dependence flags -Wl,-soname,$(soname)
  • 其一般格式爲lib$(name).so.$(major).$(minor),soname會被寫入庫文件中
  • 可以使用readelf -d $(realname)查看庫文件的soname
  • 不同realname的庫文件可以有相同的soname,有利於庫文件的升級和兼容,例如當版本從1.0.0升級到1.0.1,庫文件的接口沒有變化(或者接口增加,但原有接口不變)的情況下,可以指定相同的soname,這樣使用1.0.0生成的程序仍然可以運行。
  • soname在鏈接和加載庫文件時使用,當時使用-l$(name)鏈接庫文件時,鏈接器會讀取lib$(name).so文件中的soname值,並將其記錄在生成的程序中,當運行程序時,會從相應的目錄加載名爲$(soname)的文件,所以,在運行程序之前,$(soname)的庫文件必須已生成,
  • 可以採用軟連接的方式生成該文件,如:ln -s $(realname) $(soname)
  • 也可以使用ldconfig命令自動生成,如 ldconfig -n $(dir) 會生成$(dir)目錄下所有庫文件對應的$(soname)文件

linkname:

  • 在鏈接時使用,一般格式爲lib$(name).so,通常是$(realname)文件或者$(soname)文件的軟鏈接
  • 當使用-l$(name)選項時,鏈接器會從相應目錄鏈接lib$(name).so的文件,如果該文件不存在,則會鏈接lib$(name).a文件,如果該文件也不存在,會發生鏈接錯誤
  • 如果鏈接的是lib$(name).a文件,在運行程序時也就沒$(realname)文件和$(soname)文件什麼事了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章