linux处理dll hell的机制

48 篇文章 0 订阅

1. 共享库命名以libmath.so.1.2.3, 其中1是主版本号, 2是小版本号,3是build号. 主版本号的修改意味着接口的变化, 小版本号和build号的变化意味着bug fix

   这个名字称为动态库的real name


2. libmath.so.1这个名字,这个成为动态库的soname, 共享库build时会把soname写入共享库文件头内


3. 应用程序link时阶段,通过libmath.so(称为link name), 从系统中查找动态库, 把动态库文件头内的soname读出,保存在自己的文件头中

   以后程序运行时就会利用其文件头中的soname去系统中搜索共享库


4. 系统中利用ln命令在soname和real name之间建立关联, 达到支持以soname搜索动态库的目的

   ln -s libmath.so.1.2.3 libmath.so.1


最后,这只是一个推荐机制, 而不是强制机制



在上述机制的背后有一个程序:ldconfig

ldconfig会去搜索/lilb和/usr/lib,以/etc/ld.so.conf内所列的目录下的库文件。

搜索出可共享的动态链接库,库文件的格式为:lib***.so.**(so后一定是三个数字?),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。

缓存文件默认为/etc/ld.so.cache,该文件保存已排好序的动态链接库名字列表。

ldconfig通常在系统启动时运行,而当用户往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf文件的,但是添加完后需要调用下ldconfig, 如果安装在了其他目录下,则需要修改/etc/ld.so.conf文件内容, 然后手动运行ldconfig



简而言之:linux通过两个链接文件解决dll hell问题




一个例子:

一个库文件 libfreeimage-3.17.0.so

需要执行以下两个命令得到so文件

ln -s libfreeimage-3.17.0.so  libfreeimage.so.3

ln -s libfreeimage.so.3 libfreeimage.so




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值