如何检查(手动)升级软件是否会破坏现有软件?

如何检查(手动)升级软件是否会破坏现有软件?

举个例子,假设我想升级 sqlite3。我(apt-get)更新和升级后的版本是3.7.13。最新版本是 3.7.14。如果我从源代码安装最新版本,我是否可以知道它不会破坏这台计算机上的现有软件?是否有一些软件依赖于其他软件的列表?

对于sqlite3来说并不是真的有必要,但我仍然想知道一般情况。

我正在运行 Debian 喘息。

答案1

二进制兼容性 - ABI 和 API

要了解为什么更新可能会或可能不会破坏计算机上的现有软件,您应该对库有一个模糊的认识ABIAPIs。看这个相关问题在 StackOverflow 上了解更多信息。

共享库版本控制

软件通常至少带有主要版本号和次要版本号。我读到,一般来说,任何 ABI 不兼容性都应该随着主版本号的更改而引入。因此,如果您要在次要版本之间进行升级,通常应该安全地安装新版本而不是旧版本。

安装的共享库应该在文件名后附加一个版本号,这通常与发布版本号。构建源代码时,依赖于该共享库的其他应用程序将被链接。然后,生成的二进制文件应该使用动态链接器来查找正确的共享库,并通过其标识主要的版本号。 (这可能取决于所使用的链接器,并且可能有一个ld选项,允许您指定次要版本..)

libsqlite3

以 libsqlite3-0 (3.7.13-1) 为例,我有一个共享库文件和两个指向该库的符号链接:

> ls -l /usr/lib/x86_64-linux-gnu/libsqlite3.so*
lrwxrwxrwx 1 root root     19 Jun 14 14:05 /usr/lib/x86_64-linux-gnu/libsqlite3.so -> libsqlite3.so.0.8.6
lrwxrwxrwx 1 root root     19 Jun 14 14:05 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 -> libsqlite3.so.0.8.6
-rw-r--r-- 1 root root 692984 Jun 14 14:05 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6

那么,如何判断一个库或可执行文件是否已链接到该库,以及它依赖于哪个版本?

在 Linux 上,使用:

`ldd <filename>`

在 OS X 上:

`otool -L <filename>`

例如,让我们看看 Python 的 sqlite 模块需要什么版本的 libsqlite3 才能运行。

> ldd /usr/lib/python2.7/lib-dynload/_sqlite3.so | grep sqlite
        libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007fe32872c000)

因此它只需要主版本编号的符号链接,而不需要完整命名和编号的共享库。然后更新,应该只更新 libsqlite3.so[.0] 符号链接以指向新的共享库。

从源代码构建一个尖端的 libsqlite 将有望创建一个具有相同主版本号的共享库。如果没有,您始终可以覆盖符号链接并将其指向所需的版本,进行测试,并在必要时恢复到系统包。


资质

当您使用 Debian 时,我想我还要提到它aptitude允许您查看“依赖于 libsqlite3-0 (267) 的软件包”(对于任何其他软件包也是如此)。当然,如果您从源代码编译了很多应用程序,并且没有通知dpkg这一点,那么这个列表可能并不详尽。

答案2

查看有关该库的向后二进制兼容性的报告这里(或者可能这里)。如果比较版本之间的库中存在一些 ABI 中断,则无法升级。

此外,您的库配置可能与发行版本不同(某些特定选项,可能会强制 ABI 中的某些更改),因此最好仅在包管理器的帮助下升级您的库。

特别是 sqlite 的升级看起来很安全,因为这份报告:

在此输入图像描述

相关内容