《程序员的自我修养》读书笔记4 -- Linux共享库组织
2014-11-07 12:38
260 查看
一、共享库版本
问题来源:共享库会不停更新版本、修复BUG以及增加新的功能等。而应用程序本身独立于共享库开发。所以管理共享库兼容性至关重要。
导致C语言共享库ABI改变的行为主要有以下4种:(1)库函数(导出函数)被删除;(2)导出数据的结构发生变化;(3)导出函数的接口变化;(4)导出函数行为发生变化。
共享库版本命名:
libname.so.x.y.z
name 库的名字;
x 主版本号 表示重大升级,不同主版本号的库之间不兼容;
y 次版本号 库的增量升级,即增加一些新接口符号,且保持原来的符号不变。在主版本号不变的情况下,高的次版本号的库向后兼容低次版本号库。
z 发布版本号 库的一些错误的修正、性能的改进等,并不添加任何新的接口,也不对接口进行更改。相同主版本号、次版本号的共享库,不同的发布版本号之间完全兼容。
SO-NAME:
每个共享库都有一个对应的SO-NAME,这个SO-NAME即共享库的文件名去掉次版本号和发布版本号,保留主版本号。例如,共享库libfoo.so.2.6.1的SO-NAME是libfoo.so.2
。 在Linux系统中系统会为每个共享库在它所在的目录创建一个跟SO-NAME相同的并且指向它的软链接(Symbol Link)。
SO-NAME永远指向相同主版本号中次版本号和发布版本号最新的共享库,保证了兼容性。
当共享库实现增量升级(y修改),只需改变软连接指向最新版本共享库即可;而重大升级(x修改)时,则需要创建新的SO-NAME,同时保留旧的SO-NAME。
二、共享库系统路径和查找顺序
Linux遵守FHS (File Hierarchy Standard)的标准,这个标准规定了一个系统中的系统文件应如何存放。FHS规定,一个系统中主要有3个存放共享库的位置:
/lib 系统最关键和基础的共享库(如动态链接器、C语言运行库、数学库等);
/usr/lib 非系统运行时所需要的关键性的共享库,主要是开发时用到的共享库(用户程序或shell一般不用);
/usr/local/lib 主要是第三方应用程序的库,如python解释器对应的库/usr/local/lib/python。
查找顺序:
1. 如果DT_NEED里面保存的是绝对路径,那么动态链接器就按照这个路径去查找;
2. 如果DT_NEED里面保存的是相对路径,则按照下面的顺序查找:
(1) 由环境变量LD_LIBRARY_PATH指定的路径
(2)由路径缓存文件/etc/ld.so.cache指定的路径
(3)默认共享目录/usr/lib
(4)默认共享目录/lib
环境变量:
LD_LIBRARY_PATH 可以临时改变应用程序的共享库查找路径,而不会影响系统中的其他程序;
LD_PRELOAD 预先装载的共享库,优先于指定目录中的共享库;
LD_DEBUG 打开动态链接器的调试功能,动态链接器在运行时打印出各种有用信息。
问题来源:共享库会不停更新版本、修复BUG以及增加新的功能等。而应用程序本身独立于共享库开发。所以管理共享库兼容性至关重要。
导致C语言共享库ABI改变的行为主要有以下4种:(1)库函数(导出函数)被删除;(2)导出数据的结构发生变化;(3)导出函数的接口变化;(4)导出函数行为发生变化。
共享库版本命名:
libname.so.x.y.z
name 库的名字;
x 主版本号 表示重大升级,不同主版本号的库之间不兼容;
y 次版本号 库的增量升级,即增加一些新接口符号,且保持原来的符号不变。在主版本号不变的情况下,高的次版本号的库向后兼容低次版本号库。
z 发布版本号 库的一些错误的修正、性能的改进等,并不添加任何新的接口,也不对接口进行更改。相同主版本号、次版本号的共享库,不同的发布版本号之间完全兼容。
SO-NAME:
每个共享库都有一个对应的SO-NAME,这个SO-NAME即共享库的文件名去掉次版本号和发布版本号,保留主版本号。例如,共享库libfoo.so.2.6.1的SO-NAME是libfoo.so.2
。 在Linux系统中系统会为每个共享库在它所在的目录创建一个跟SO-NAME相同的并且指向它的软链接(Symbol Link)。
SO-NAME永远指向相同主版本号中次版本号和发布版本号最新的共享库,保证了兼容性。
当共享库实现增量升级(y修改),只需改变软连接指向最新版本共享库即可;而重大升级(x修改)时,则需要创建新的SO-NAME,同时保留旧的SO-NAME。
二、共享库系统路径和查找顺序
Linux遵守FHS (File Hierarchy Standard)的标准,这个标准规定了一个系统中的系统文件应如何存放。FHS规定,一个系统中主要有3个存放共享库的位置:
/lib 系统最关键和基础的共享库(如动态链接器、C语言运行库、数学库等);
/usr/lib 非系统运行时所需要的关键性的共享库,主要是开发时用到的共享库(用户程序或shell一般不用);
/usr/local/lib 主要是第三方应用程序的库,如python解释器对应的库/usr/local/lib/python。
查找顺序:
1. 如果DT_NEED里面保存的是绝对路径,那么动态链接器就按照这个路径去查找;
2. 如果DT_NEED里面保存的是相对路径,则按照下面的顺序查找:
(1) 由环境变量LD_LIBRARY_PATH指定的路径
(2)由路径缓存文件/etc/ld.so.cache指定的路径
(3)默认共享目录/usr/lib
(4)默认共享目录/lib
环境变量:
LD_LIBRARY_PATH 可以临时改变应用程序的共享库查找路径,而不会影响系统中的其他程序;
LD_PRELOAD 预先装载的共享库,优先于指定目录中的共享库;
LD_DEBUG 打开动态链接器的调试功能,动态链接器在运行时打印出各种有用信息。
相关文章推荐
- 【程序员的自我修养】第8章 Linux共享库的组织
- 【读书笔记】linux系统中"共享文件"的原理
- Linux共享库的组织 - notes
- Linux共享库组织
- Linux下IPC共享内存通信
- 《LINUX与UNIX_Shell编程指南》读书笔记第5章shell输入与输出
- 网络安全:经验共享——随心订制linux透明防火墙
- 玩家社群组织开发程式让 Linux 在 NDS 上运行
- 《LINUX与UNIX_Shell编程指南》读书笔记第4章文件名置换
- 共享Linux 和Windows Server 2003 网络资源
- 用Linux作文件共享服务器
- 将 Win32 C/C++ 应用程序迁移到 POWER 上的 Linux,第 1 部分: 进程、线程和共享内存服务 (转载)
- 共享 Windows 磁盘给 Linux 机器
- web版的outlook和project的结合,再和sns 结合,形成组织之间的一个共享信息.还有更多应用
- Linux 共享库
- Linux下共享库(SO)有关的几个环境变量
- 广东 9 月组织 Linux 首次系统管理员试点考试
- 《LINUX与UNIX_Shell编程指南》读书笔记第3章后台执行命令
- 扫盲行动之五:在Linux中共享Windows系统资源
- linux 下创建共享库.so