自由标准团体的Linux Standard Base(LSB)提出一个由Linux源代码支持,与开发商无关的标准,来建立Linux平台。这个基本标准意在为从Linux衍生而来的各个发行类和在其上运行的应用程序提供一个参考平台。所以,任何在这个参考平台上成功运行的程序也可以在所有符合LSB标准的Linux系统上运行。LSB标准只关心在Linux操作系统中,那些贯穿整个平台的可以影响应用程序兼容性的元素。LSB标准有以下三个目标:
使得软件应用程序可以在任何符合LSB的版本上运行。
增强Linux各发行版本的兼容性。
帮助支持软件公司和开发商为Linux开发相应软件。
为了达到这些目标,LSB提供:
一份详细的说明书。
一个试验版本来测试是否符合LSB标准。
一个开放源码的符合LSB标准的简易版运行样本。
LSB详细说明了二进制应用程序接口(ABI),这是为在GNU/Linux操作系统上运行的符合LSB的应用程序提供的二进制环境。ABI为应用程序访问Linux内核提供了一个与API函数和类库相一致的层。表格1列出了组成ABI的库。
LSB的详细组成说明
普通的LSB标准说明书,描述各个在LSB标准中必须有的硬件接口。
特定结构的说明书,描述一个特定处理器结构的各接口部分。
总体上,他们提供了一份在一个Linux系统通用的硬件体系中编译应用程序所需的全部接口的说明书。(LSB的1.0版只支持C和C++的应用程序)
ABI库
系统接口 | 系统接口类(libc) 数学类(libm) 动态导入器(libdl) 加密类(libcrpt) P线程(libpthreads) 异步I/O(librt) |
辅助接口 | Compression(libz) Utility Functions(libutil) Curses(libcurses) |
图形界面 | X Windows system(libX11) X11 Extension(libXext) X11 Intrinsics(libXt) X11 Session Mgnt.(linSM) X11 Inter-Client Exchange(libICE) GL 3D Graphics(libGL) |
根据以下方面判断Linux平台是否符合LSB。
通用系统库。(在符合LSB标准的类别中列出了库列表,这个列表是对体系结构说明书的补充。)
通用系统命令。
文件系统层次。(LSB使用标准文件层次来说明文件,库和指令在一个符合LSB的系统中是怎么被调用的。)
基本软件安装。
对象文件格式。(遵守LSB的系统支持对象文件的执行和链接格式。[ELF])
不同Linux平台上的应用程序不兼容其大部分原因是由处理公共库的方法不同造成的。每类平台可能都有一个库的不同版本,这使得开发者很为难,不知道将应用程序从一个Linux平台转到另一个时应该用哪个库。例如,Linux平台经常包括不同版本的调用标准函数和工具的库,诸如glibc, pthreads, libm Xt, ncurses等。应用程序可以在glibc 2.1这个版本上编译运行,但不一定能在另一个不同版本(例如 glibc 2.0 或glibc 2.2.)的平台上通过。而且,一个应用程序需要的库版本可能会更新一些而覆盖现存的库,但这个版本可能会和运行在前一个库上的应用程序发生冲突。
LSB试图解决这个问题,定义一个最小的库集作为基础平台的一部分,避免通用库发生冲突。而且被认可的库在LSB标准中有一个唯一的名字。例如,libcrypt.lsb.1。单独的命名习惯将避免程序用同一个库的更高版本去覆盖原有的库。例如,如果一个Linux开发商在libcrypt.lsb.1之后开发了一个拥有新特征的libcrypt版本,那他就应该用与LSB库名称不同的名字来命名,诸如libcrypt.so.1.2。这个文件可以代替libcrypt.so.1.1,但只有LSB认可并作为LSB库被重新命名后才能代替libcrypt.lsb.1。这使得应用程序可以利用最新的特征而不防碍需要LSB库的其他程序。这个想法使得新的库和符合LSB的库可以共存,确保相互的兼容性而又避免侵犯开发商在新的版本中添加特性的权利。
LSB测试步骤
测试一个应用程序是否符合LSB的三个步骤:
在编译的时候,用/usr/lsb/lib下LSB的基本库链接二进制应用程序,这样可以判断程序是否只用了LSB中的API。
将应用程序链接在LSB的/lib/ld-lsb.so.1 linker/loader上。
用LSB的/usr/bin/lsbappchk工具测试二进制应用程序,判断在运行期间,程序是否只用了LSB中定义的API。lsbappchk的输出显示了测试没有包含在LSB中的API调用。补救措施是,用户通过选择链接器从供应商那儿获得一个动态库来填补所需的API调用,或者,从供应商那儿获得一个动态库并通过设置LD_LIBRARY_PATH环境在运行时调用。
LSB实施样例
LSB实施样例是一个独立的符合LSB最小化的Linux版本,它可以在任何包含2.4内核的Linux平台上运行。
符合LSB的相关库
库 | 运行时的名称运行时的名称 |
libX11 | libX11.so.6 |
libXt | libXt.so.6 |
libGL | libGL.so.1 |
libXext | libXext.so.6 |
libICE | libICE.so.6 |
libSM | libSM.so.6 |
libdl | libdl.so.2 |
libcrypt | libcrypt.so.1 |
libz | libz.so.1 |
libncurses | libncurses.so.5 |