UNIX glibc 的用户信息

C 库属于所有 UNIX 系统最重要的组件,因为该库负责应用程序与内核进程之间的顺畅交互。

下面为您提供了一些建议和背景信息,从而帮助您确定:

  • 安装的 AntiVir 扫描程序是否适用于计算机环境
  • 在出现不一致情况时,从何处获取更新

背景

几乎所有 UNIX 系统组件(操作系统本身、系统程序以及绝大部分应用程序)都是直接用 C 语言编写,或是基于用 C 语言编写的组件。

应用程序在运行过程中基于的基本例程通常都在称为 libc 的库中。 其中包括与文件、内存存储、网络、进程管理有关的操作,以及对操作系统所执行的所有服务的访问。

出于合乎逻辑的理由,不会在每个程序中一遍又一遍地创建和提供这些例程。 这些例程安装在系统中的一个中心位置,始终可供程序使用。 由于 UNIX 一直支持共享库(相当于其他平台上的 DLL)的概念,将相应的应用程序划分为所谓的动态链接二进制文件便成为一种通行做法。 在程序启动时,底层的基础系统先提供链接的 C 库。

此 libc 在 Linux 下的最常见实现为 glibc。 与所有应用广泛的流行开放源代码项目一样,此代码也处于不断的开发和修订过程之中。 Bug 在不断修复,函数数量在不断增加,增强功能也在不断实现。 在此动态发展过程中,还将根据同样在不断修改和发展的通用标准不断进行调整。

因此,各处出现某些不一致的情况几乎在所难免。 不一致的情况“表面”看来可能是具有同质性和收敛性,但倘有进一步的偏差便可能导致应用程序要求方便的差异。 例如,语义的更改可能造成原本以某种方式解释数据的接口突然改用其他过程。 另一种可能的影响: 接口可能通过修改其参数而发生变形,并会修改其操作方法(例如由于功能的增强)。

由于这些原因,库(其当前开发状态以及由此而决定的行为)处于严格的版本控制之下。 然而,并非所有版本都“完全”相互兼容。 向上和向下兼容性通常是开发的目标。 然而,在紧密相邻的版本之间才能实现此目标(如果的确可能实现)。 换言之: 兼容性就字面意义而言,即不能进行任何重大更改。

那么,接下来还要做些什么呢? 如果有操作系统和应用程序安装文件,则转换整个系统是实现一致状态的便利方式。 如果以二进制文件形式获取应用程序,则在下载时必须选择正确的版本。 应时刻谨记的是,对于基础组件的更新,处于上层的组件和要进行更新的组件中可能存在依存关系。 例如,如果将诸如 libc 这样的关键系统组件替换或升级为另一个版本,则绝对有必要对操作系统和所有应用程序软件都进行更新。


确定 AntiVir 需要支持的库版本

听来奇怪,但由于兼容性和互操作性原因,正在运行的应用程序无法确定安装的 libc 版本,也无法指定该应用程序是否能在此环境中运行。 库设计中甚至没有计划版本的确定方式(即使有个别实现能够提供此功能,但其操作过程也不见得在所有其他系统和平台上都有效)。 同时,我们并不真正了解根源所在: 如果一个应用程序由于所需版本与可用版本不一致而无法运行,该应用程序又如何启动并测试自身的操作性?

不幸的是,我们无法将用户从下述工作中解救出来,也无法使事情变得如我们所希望的那样简单。 上述情况要求管理员时刻密切注意已安装软件的一致状态(其他人员不能完成此任务)。 但是,我们至少可以提供有关识别和解决问题的指南。


解决问题

以下问题与 Linux 和 GNU-C 库有关。 上述各个方面自然也适用于其他平台,但迄今为止只有在 Linux 与 GNU libc 的组合下才可在所提供的版本中选择一个。

glibc 库在硬盘中所采用的格式使其可以用作“普通程序”。 这不仅在开发阶段有所帮助,还使重要信息的提取成为可能。

通过运行:
/lib/libc.so.6 | head -1
可以查看版本号(实际上输出的信息要多很多,但可以只看第一行信息,因为其中显示了版本号)。 如果此命令产生如“权限被拒绝”这样的错误,或是如果由于其他原因而未将文件识别为“程序”,您可以尝试使用下面的命令启动该文件
/lib/ld-linux.so.2 /lib/libc.so.6 | head -1
如果版本号以 2.0 或 2.1 开头,则必须使用标记为 glibc20 的软件存档。 如果版本号以 2.2 或 2.3 开头,则必须使用标记为 glibc22 的存档。 (内部)版本 1 中也包含libc 库,此时相应的文件名为 libc.so.5。 虽然此实现不是最新的且所含功能不多,但由于其明显缩小的范围(缺少国际化功能),因此经常插入到嵌入式系统中,并且在需要考虑经济性或不考虑更新的情况下也经常使用。

除了 libc GNU 版本外,还存在 libc 库的其他实现,以满足不同的目标,如“小体积”或“极强的可移植性”目标。 但是,由于此软件的应用是深思熟虑的结果(不是“偶然”应用,或通过标准分发安装方式应用),因此我们假设相关管理员非常熟悉他们的系统。 他们无论如何都会考虑到我们讨论的这些问题,并且应确切知道哪个 glibc 实现最能满足其需要。 换言之,他们应已知道应使用哪个 Avira 软件存档。

在 lib 目录中未提供包含 libc 实现的文件这种异常情况下,管理员应当知道在何处可以找到此文件。 加载程序知道在正在运行的系统中的何处可以找到共享对象。 如果不能肯定,您可以运行命令:
ldd /bin/ls(或其他动态链接程序)
并搜索包含 libc 的行(或者,若如前文所述某个库没有作为程序启动,则搜索 ld-linux)。


摘要

外部程序“只”提供应用程序的高级逻辑,而借助系统组件(如 libc)实现低级功能。 如果这两种组件不能相互匹配,则软件无法正常工作(可能产生不同程度的后果:从“似乎可以工作”,到“有时可以工作,但多数情况不能工作”,再到“完全不能正常工作,一点作用都没有”,最后到“格式化我的硬盘,让我掉光了头发,我的猫都不再喜欢我了”)。

应用程序本身无法通过令人满意的方式对兼容性进行测试。 这让用户合作变得不可或缺,需要由用户负责系统的一致性和可操作性。 因为我们的软件针对不同的环境以不同的变体提供了 Linux 版本,所以需要基于各自安装的 C 库进行决策。

可以使用下面的命令确定已安装的 C 库在硬盘上的完整文件路径以及已安装实现的版本:

$ ldd /bin/ls /bin/bash /usr/bin/vi/bin/ls:

librt.so.1 => /lib/librt.so.1 (0x4001e000)
libc.so.6 => /lib/libc.so.6 (0x40030000)
libpthread.so.0 => /lib/libpthread.so.0 (0x40160000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

/bin/bash:

libdl.so.2 => /lib/libdl.so.2 (0x4001e000)
libc.so.6 => /lib/libc.so.6 (0x40022000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

/usr/bin/vi:

libncurses.so.5 => /lib/libncurses.so.5 (0x4001e000)
libgpm.so.1 => /usr/lib/libgpm.so.1 (0x40066000)
libdl.so.2 => /lib/libdl.so.2 (0x4006c000)
libperl.so.1 => /usr/lib/libperl.so.1 (0x4006f000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x4016f000)
libutil.so.1 => /lib/libutil.so.1 (0x4019c000)
libpthread.so.0 => /lib/libpthread.so.0 (0x4019f000)
libm.so.6 => /lib/libm.so.6 (0x401f0000)
libc.so.6 => /lib/libc.so.6 (0x40213000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

$ /lib/libc.so.6 | head -1
GNU C Library stable release version 2.3.1, by Roland McGrath et al.

将根据已安装的 C 库来安装 Avira 软件的合适存档。 Linux 版本 AntiVir 软件的设计方式使之可与 2.2 或 2.3 版 GNU-libc 一起运行。 对于资源有限的系统,或对于由于其他原因而使用 libc5 的情况,我们也提供了相应的版本。 不在系统上使用 GNU 实现的管理员应根据需要选择最合适的存档。

受影响的产品

  • Avira AntiVir MailGate [Linux]
  • Avira AntiVir MailGate [Solaris]
  • Avira MailGate Suite [Linux]
  • Avira WebGate Suite [Linux]
  • Avira WebGate Suite [Solaris]
  • Avira AntiVir Professional, 版本 10 [Linux]
  • Avira AntiVir Professional, 版本 10 [Solaris]
  • Avira AntiVir Server, 版本 10 [Linux]
  • Avira AntiVir Server, 版本 10 [Solaris]
  • 已创建 : 2007年3月14日星期三
  • 上次更新 : 2011年3月21日星期一
  • 评价此文章