[读书笔记]程序员的自我修养 chp8

8.1 共享库版本

8.1.1 共享库兼容性

  1. 共享库的更新被分为两类:
    1. 兼容更新
    2. 不兼容更新
  2. 这个和二进制接口有关系 ie, ABI
  3. 不建议使用C++ 做共享库
  4. 这里写图片描述

8.1.2 共享库版本命名

  1. 形如: libname.so.x.y.z
  2. x 为主版本号, 表示重大升级
  3. y 表示此版本号, 表示增量升级
  4. z 表示发布版本号, 不添加任何新接口, 也不对接口进行更改
  5. 有些库, 如 Glibc 不遵从这个命名规则

8.1.3 SO-NAME

  1. 利用SO_NAME 可以自动定位到最新版本共享库的特性, 确保升级时候可以兼容
  2. 系统会为每个共享库建立一个跟 SO-NAME 相同的并且指向它的软连接

8.2 符号版本

  1. 此版本号交汇问题: 由于动态连接器在进行动态链接的时候, 只对主版本号进行判断, 如果依赖的共享库的SO-NAME 和系统中实际的共享库的SO-NAME 一致, 就不在进行检查, 带来版本号交汇的问题

8.2.1 基于符号的版本机制

  1. 对每个版本的全局符号添加一个标记 如 VERS_1.3

8.3 共享库路径

  1. 遵从 FHS 标准:
    1. /lib 存放系统最关键和基础的共享库
    2. /usr/lib 存放非系统运行时候所需要的关键共享库
    3. /usr/local/lib 存放第三方软件的共享库

8.4 共享库的查找过程

  1. 动态链接的模块所依赖的模块路径保存在 .dynamic 段里面, 由DT_NEED 标识, 如果放置相对路径, 会依次从 /lib, /usr/lib, /etc/ld.so.conf 指定的目录进行查找
  2. 为提高检索效率, 通过 /etc/ld.so.cache 实现缓存命中等操作

8.5 环境变量

  1. LD_LIBRAY_PATH 可以临时改变某个应用程序的共享库查找路径, 而不影响其他程序
  2. LD_PRELOAD 最优先加载
  3. LD_DEBUG 输出调试信息

8.6 共享库的创建和安装

  1. 使用 strip 清除符号信息
  2. 使用 attribute 可以指定共享库的构造和析构函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值