5.4 共享库
如果你想添加共享库支持到一个原来不包含共享库支持的 port 或是其它软件, 共享库的版本号应该遵循如下规则。通常来说,由此得出的数字与软件的发行版本无关。
建立共享库的三个原则是:
从1.0开始
如果改动与以前版本相兼容,增加副版本号(注意,ELF系统忽略副版本号)。
如果是个不兼容的改动,增加主版本号。
例如,添加函数和修正错误导致副版本号增加, 而删除函数、函数调用语法改变等,会迫使主版本号改变。
保持这种形式的版本号:主版本号.副版本号 (x.y)。 我们的 a.out 动态链接器不能很好的处理 x.y.z 形式的版本号。在比较共享库版本号以决定跟哪个库文件链接的时候, 任何y以后的版本号(那是指第三个数字) 总是会被忽略。 如果给定的两个共享库的不同在于“细微”版本 (“micro” revision)的话, ld.so将会与较高修订版本的链接。即,如果你要与 libfoo.so.3.3.3链接,链接器只在(ELF文件的)头部记录 3.3, 并且在连接时,与文件名以 libfoo.so.3.(任何数字 >= 3).(现有的最高数字) 开头的任何文件链接。
注意: ld.so 总是会使用 “副”版本号最高的。例如,即使一个程序最初是(被设定)与 libc.so.2.0链接的, ld.so也会优先选择使用 libc.so.2.2,而不是 libc.so.2.0。
另外,我们的 ELF 动态链接器完全不处理副版本号。 可我们还是应该指定一个主版本号和副版本号,因为我们的 Makefile 会按系统类型“做正确的事”。
对于不属于某个 port 的库文件,我们的原则是在各个 FreeBSD 正式发行版 (RELEASE)之间只改变一次共享库版本号(译者注:一般只是副版本号)。 并且,在 FreeBSD 正式发行版 (RELEASE) 主版本之间(那是指像从 3.x 到 4.x), 也应该仅改变一次共享库主版本号。 当你需要对系统库做一些改变并要增加版本号时, 请查看 Makefile的提交日志。 这是 committer 的责任:确保自(最近的)正式发行版 (RELEASE) 之后只有第一次这样的改动会让在 Makefile 里的共享库版本号更新, 而随后的(在下一个 RELEASE 之前的)改动不会使共享库版本号更新。