Linux如何解决动态库的版本控制
【操作系统】 Linux如何解决动态库的版本控制
--------------------------------------------
傻大方资讯为您精选的网友回复(供您参考):
[育儿]3.共享库,小版本升级,即接口不变.当升级小版本时,共享库的soname 是不变的,所以需要重新把soname 的那个连接文件指定新版本就可以。 调用ldconfig命令,系统会帮你做修改那个soname link文件,并把它指向新的版本呢。这时候你的应用程序就自动升级了。4.共享库,主版本升级,即接口发生变化。当升级主版本时,共享库的soname 就会加1.比如libhello.so.0.0.0 变为 libhello.so.1.0.0. 这时候再运行ldconfig 文件,就会发现生成两个连接 文件。ln -s libhello.so.0----libhello.so.0.0.0ln -s libhello.so.1-----libhello.so.1.0.0尽管共享库升级,但是你的程序依旧用的是旧的共享库,并且两个之间不会相互影响。问题是如果更新的共享库只是增加一些接口,并没有修改已有的接口,也就是向前兼容。但是这时候它的主版本号却增加1. 如果你的应用程序想调用新的共享库,该怎么办? 简单,只要手工把soname 文件修改,使其指向新的版本就可以。(这时候ldconfig 文件不会帮你做这样的事,因为这时候soname 和real name 的版本号主板本号不一致,只能手动修改)。比如: ln -s libhello.so.0 --- libhello.so.1.0.0但是有时候,主版本号增加,接口发生变化,可能向前不兼容。这时候再这样子修改,就会报错,“xx”方法找不到之类的错误。总结一下,Linux 系统是通过共享库的三个不同名字,来管理共享库的多个版本。 real name 就是共享库的实际文件名字,soname 就是共享库加载时的用的文件名。在生成共享库的时候,编译器将soname 绑定到共享库的文件头里,二者关联起来。 在应用程序引用共享库时,其通过link name 来完成,link时将按照系统指定的目录去搜索link名字找到共享库,并将共享库的soname写在应用程序的头文件里。当应用程序加载共享库时,就会通过soname在系统指定的目录(path or LD_LIBRARY)去寻找共享库。当共享库升级时,分为两种。一种是主板本不变,升级小版本和build 号。在这种情况下,系统会通过更新soname( ldconfig 来维护),来使用新的版本号。这中情况下,旧版本就没有用,可以删掉。另外一种是主版本升级,其意味着库的接口发生变化,当然,这时候不能覆盖已有的soname。系统通过增加一个soname(ldconfig -p 里面增加一项),使得新旧版本同时存在。原有的应用程序在加载时,还是根据自己头文件的旧soname 去寻找老的库文件。这是一个trick 的地方。第一系统将会在生成库的时候,就没有soname放到库的头里面。从而应用程序连接时候,就把linkname 放到应用程序依赖库里面。或者换句话说就是,soname这时候不带版本号。 有时候有人直接利用这点来升级应用程序,比如,新版本的库,直接拷贝到系统目录下,就会覆盖掉已经存在的旧的库文件,直接升级。 这个给程序员很大程度的便利性,如果一步小心,就会调到类似windows的Dll hell 陷阱里面。建议不要这样做。【Note】1. 指定共享库加载的路径。LD_LIBRARY_PATH 优先于 path 环境变量。2. ldd 可以查看程序,或者共享库依赖的库的路径3. nm 查看共享库暴露的接口4. ldconfig 可以自动生成soname 的连接文件。并提供catch 加速查找。5.readelf 可以查看动态库的信息,比如依赖的库,本身的soname。6. objdump 与readelf 类似。7 ld The GUN linker8. ld.so dynamic linker or loader9. as the portable GNU assembley
--------------------------------------------
- 【学习成长突破】如何帮助孩子提升社会能力?
- 在职考研如何选择合适的学校?
- 日常生活必备:如何用英语口语讨论穿衣。
- 三维可视化系统如何辅助决策?
- 店铺合辑视频如何用淘拍一键上传?
- 【自在养生】熬夜后如何恢复 小妙招让你元气满满
- 年轻化转型风口正劲 看统帅如何为家电业创新赋能
- 经验分享|高考学霸经验谈:如何消除自己的疑问?
- 是美是丑到底值不值得买? 来看看网友是如何评价坚果3的
- 如何成为一款合格的【游戏手机】?这几个要点是必须的