linux标准学习之-LSB(下)

本文介绍了Linux Standard Base (LSB) 的标准化流程,包括新领域纳入标准的三个步骤:鉴定、调研和实现。此外,还详细阐述了LSB认证的过程,以及如何通过认证确保系统和服务的兼容性和可移植性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LSB 的标准化流程

LSB 对于标准的制定和推广遵循务实的原则,它自己不会自行制定标准然后强行要求业界接受,而是把业界中已经成熟的技术和规范采用标准化的形式固定下来,然后大力加以推广,这样可以更广泛地为软件供应商和用户接受。

一个新领域要想纳入 LSB 标准的范畴,必须经过以下 3 个步骤:

1. 鉴定:确认这个领域是否已经足够成熟,是否具有稳定的 ABI/API,是否需要进行标准化,以及是否依赖于尚未标准化的领域。

2. 调研:调查上游软件维护者是否还在积极维护,软件是否稳定,是否具有很好的向后兼容性。

3. 实现:将该领域加入 LSB 数据库、编写规范、编写测试套件、并将其加入开发环境、SI 和 APPBAT。

经过这 3 个步骤之后,LSB Future SubGroup 就会将其提交给 LSB 工作组,将其包含到 LSB 的下一个版本中进行发布,并对外提供认证服务。

认证

在制定好标准并开发出测试套件之后,为了区分系统或应用程序是否兼容 LSB 标准, FSG 提供了 LSB 标准认证服务。任何 Linux 发行版厂商和应用程序开发商都可以进行 Linux 认证,目前提供的认证有两种:

  • LSB 运行环境:为平台供应商提供的 LSB 标准认证
  • LSB 应用程序:为应用程序开发商提供的 LSB 标准认证

对于平台供应商来说,经过 LSB 认证之后,就可以确保自己的系统所提供的服务都是标准的,任何遵守 LSB 标准的应用程序都可以很好地在自己的系统上运行;而对于应用程序开发商来说,其意义则刚好相反:不需要担心自己的应用程序在遵守 LSB 标准的系统上的可移植性问题。

LSB 认证过程包含以下步骤:

  • 注册:要进行 LSB 认证的第一个步骤是在 https://www.freestandards.org/index.php?title=Special:Userlogin 上先创建一个帐号,并注册您的公司和产品。
  • 测试和验证:使用 LSB 提供的测试工具,在您的测试系统上运行,并对结果进行分析(详细内容请参看本系列的下一篇文章),确保您的系统或应用程序遵守 LSB 规范。
  • 最 终审计:在准备好正式提交测试结果之后,需要先签署 LSB 认证协议和 LSB 商标许可协议,并向 FSG 支付认证所需要的费用。然后 FSG 会有专人对测试结果进行审计,如果一切正常,就通过了 LSB 认证。通过 LSB 认证的产品都会在 http://www.freestandards.org/en/Products 公开发布。目前已经 Redhat、Suse、RedFlag 等公司都已经通过了 LSB 3.0 的认证,对于 LSB 3.1 的认证正在进展中。

通过 LSB 认证之后,所认证的产品可以贴上 "LSB Certified" 的标签进行销售了。

认证问题报告

在运行 LSB 所提供的测试工具时可能会出现部分测试用例失败的情况,其原因可能是产品本身的问题,例如 FHS 标准要求系统中必须存在 /media/ 目录,而在某些系统中,这个目录可能并不存在,此时就可能会导致相应的测试套件失败,错误信息如下:


10|715 /tset/LSB.fhs/root/media/media-tc 00:55:04|TC Start, scenario ref 720-0
15|715 3.7 5|TCM Start
400|715 1 1 00:55:04|IC Start
200|715 1 00:55:04|TP Start
520|715 1 30056 1 1|Reference 3.11-1(A)
520|715 1 30056 1 2|The /media directory exists and is searchable
520|715 1 30056 1 3|/media: directory not found
520|715 1 30056 1 4|exit code 1 returned, expected 0
220|715 1 1 00:55:04|FAIL

但是有时可能并非是测试环境的问题,而是测试套件本身的问题,或者是由于系统中存在一个公认但却暂时无法修复的问题,此时并不影响 LSB 的认证的结果。如果出现这种问题,测试人员可以将这个问题反馈给 LSB(http://www.freestandards.org/cert/prsubmit.php),经过确认之后,LSB 会在一个 waiver 文件中列出这种情况,并将对应的测试套件暂时剔除,并尝试在下一个版本中进行修复。我们也可以从http://www.freestandards.org/cert/pr.php 上查看已经发现的问题。


转载:linux标准学习之-LSB(下)
转载:linux标准学习之-LSB(下)
转载:linux标准学习之-LSB(下)
转载:linux标准学习之-LSB(下)
回页首


LSB 的历史、现状和将来

LSB 项目最初发起于 1998 年 5 月,其项目启动宣言得到了 Linus Torvalds、Bruce Perens、Eric Raymond 等人的签名支持,当时的目标是建立一系列构建 Linux 发行版所采用的源代码应该遵循的标准,并提供一个参考平台。2000 年 5 月,LSB 成为 Free Standards Group(FSG) 的一个工作组。FSG 是一个独立的非盈利组织,专注于通过开发和促进标准来加速开源软件的发展。

从 2001 年 6 月发布第一个正式版本的规范以后,LSB 规范几乎每 6 个月都会进行一次更新。截止到 2005 年 7 月发布的 3.0 版本为止,LSB 重点关注的是服务器端的使用,这与 Linux 在服务器端得到了广泛的应用是一致的。这个规范已经被 ISO 采纳为国际标准 23360。

目前最新的版本规范是 2005 年 10 月发布的 LSB 3.1,目前它可以支持 7 种体系结构:

  • IA32
  • IA64
  • X86_64
  • PPC32
  • PPC64
  • S390
  • S390x

由于平台的差异,所有的规范除了有一个通用的版本之外,还都存在一个适用于特定平台的版本,其中的内容是完全适用于这个平台的。

与上一个版本相比,LSB 3.1 版本的规范主要是增强了对桌面系统的标准化支持,增加了对 GTK 和 QT GUI 工具包的标准化。另外,LSB 还调整了自己的路线图,以便可以与主流的 Linux 发行商(Redhat、Novell、Asianux、Debian 等)的发行计划更好地吻合,并吸引了更多 Linux 发行商的参与,对开发工具和文档进行了改进,还与各个国家的组织(例如中国电子技术标准化研究所,CESI)进行认证方面的合作。

下一个版本 LSB 3.2 将在 2007 年第二季度发布,将主要增加 freedesktop.org 的标准和跨桌面的交互操作性。

LSB 4.0 将在 2008 年发布,它将实现更好的二进制兼容性,并增加对 Perl、Python、LAMP、Java 等语言的标准化支持。详细路线图及各个主要版本的特性如图 3 所示:


图3. LSB 主要版本的路线图
图3. LSB 主要版本的路线图

转载:linux标准学习之-LSB(下)
转载:linux标准学习之-LSB(下)
转载:linux标准学习之-LSB(下)
转载:linux标准学习之-LSB(下)
回页首


实例:lsb_release 的规范定义和实现

我们知道,在 /etc 目录中有一个文件可以查看当前系统的版本信息,在 RHEL4U3(Red Hat Enterprise Linux 4 Update 3)上这个文件是 /etc/redhat-release:


在 SLES9SP3(SUSE LINUX Enterprise Server 9 Service Pack 3)上这个文件是 /etc/SuSE-release:


# cat /etc/SuSE-release 
SUSE LINUX Enterprise Server 9 (i586)
VERSION = 9
PATCHLEVEL = 3

我们可以看出,在这两个发行版上,不但使用的文件不同,文件的内容和格式也完全不同。如果开发人员在自己的程序中使用这些信息,他们就很难使用一个 统一的接口来获取发行版本的信息,因此必须为每种平台都定制一个脚本或开发一个程序才能实现这种功能,这无疑会增加很多工作量,而且所生成的程序的可移植 性也会很差。

为了解决这个问题,LSB 规范中增加了对 lsb_release 接口及其输出格式的定义:lsb_release 的功能是打印与发行版本相关的信息,必须实现以下选项(详细规范的定义请参考http: //refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/lsbrelease.html):


表1. LSB对lsb_release 接口定义
表1. LSB对lsb_release 接口定义

我们前面已经介绍过,通过 LSB 认证发行版或软件可以得到 FSG/LSB 的授权,贴上 "LSB Certified"的标签进行销售。实际上,在通过 LSB 认证的系统上,我们可以看到一个与 LSB 有关的包,其中包含了 LSB 规范中对 lsb_release 接口规范的实现。lsb_release 是 LSB-Core-generic 规范中要求的一个接口,各种平台(目前可以支持的 7 种平台: IA32、IA64、X86_64、PPC32、PPC64、S390 和 S390x)上都应该提供这个接口的实现。在 RHEL4U3 上,我们可以找到一个名为 redhat-lsb 的包(RHEL4U3 遵守的是 LSB 3.0 版本的规范,因此这个包的版本是 redhat-lsb-3.0-8.EL),该包的内容如下:


# rpm -ql redhat-lsb
/bin/mailx
/etc/lsb-release.d
/etc/lsb-release.d/core-3.0-ia32
/etc/lsb-release.d/core-3.0-noarch
/etc/lsb-release.d/graphics-3.0-ia32
/etc/lsb-release.d/graphics-3.0-noarch
/etc/redhat-lsb
/etc/redhat-lsb/lsb_killproc
/etc/redhat-lsb/lsb_log_message
/etc/redhat-lsb/lsb_pidofproc
/etc/redhat-lsb/lsb_start_daemon
/lib/ld-lsb.so.3
/lib/lsb
/lib/lsb/init-functions
/usr/bin/lsb_release
/usr/lib/lsb
/usr/lib/lsb/install_initd
/usr/lib/lsb/remove_initd
/usr/sbin/redhat_lsb_trigger.i386
/usr/share/man/man1/lsb_release.1.gz

而在 SLES9SP3 中,这个包的名字是 lsb(lsb-3.0-4.8),它包含的内容如下:


# rpm -ql lsb 
/etc/lsb-release
/etc/lsb-release.d
/etc/lsb-release.d/graphics-2.0-ia32
/etc/lsb-release.d/graphics-2.0-noarch
/etc/lsb-release.d/graphics-3.0-ia32
/etc/lsb-release.d/graphics-3.0-noarch
/lib/ld-lsb.so.2
/lib/ld-lsb.so.3
/usr/bin/lsb_release
/usr/share/man/man1/lsb_release.1.gz

我们可以看出,在这两个发行版上的两个包中存在一些共同的文件:

  • /usr/bin/lsb_release
  • /lib/ld-lsb.so.3

其中 /lib/ld-lsb.so.3 在两个系统上都是一个符号链接:


# ls -l /lib/ld-lsb.so.3 
lrwxrwxrwx 1 root root 13 Apr 20 03:04 /lib/ld-lsb.so.3 -> ld-linux.so.2

系统中提供的大部分应用程序都是链接到了 ld-linux.so.2 上,但是兼容 LSB 标准的应用程序都可以链接到 ld-lsb.so.3 上(由于 SLES9SP3 还兼容 LSB 2.0 的规范,因此系统中还存在一个 /lib/ld-lsb.so.2 库,也是指向 ld-linux.so.2 的符号链接;而 RHEL4U3 不兼容 LSB 2.0 的规范,因此没有这个库)。

而 /usr/bin/lsb_release 就是对 lsb_release 接口的具体实现,在这两个系统上都是一个 shell 脚本。下面我们分别在这两个系统上执行 lsb_release -a 命令,在 RHEL4U3 上的结果如下:


# /usr/bin/lsb_release -a
LSB Version: 
:core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch:log
Distributor ID: RedHatEnterpriseES
Description: Red Hat Enterprise Linux ES release 4 (Nahant Update 3)
Release: 4
Codename: NahantUpdate3

在 SLES9SP3 上的结果如下:


# /usr/bin/lsb_release -a
LSB Version: 
core-2.0-noarch:core-3.0-noarch:core-2.0-ia32:core-3.0-ia32:graphics-2.0-ia32:
graphics-2.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
Distributor ID: SUSE LINUX
Description: SUSE LINUX Enterprise Server 9 (i586)
Release: 9
Codename: n/a

我们可以看出,在这两个系统上,lsb_release 命令的位置、用法、输出格式都是相同的,因此开发人员可以使用它编写兼容性非常好的程序。

再看一下在这两个系统上与 lsb_release 有关的包,我们会发现二者之间有一些区别,例如在 SLES9SP3 上存在一个 /etc/lsb-release 文件,其中存放的是所遵循的 LSB 标准的版本,内容如下:


# cat /etc/lsb-release
LSB_VERSION="core-2.0-noarch:core-3.0-noarch:core-2.0-ia32:core-3.0-ia32"

而在 RHEL4U3 上并没有这个文件,但是在 /etc/lsb-release.d 目录中的文件却比 SLES9SP3 上多:

  • /etc/lsb-release.d/core-3.0-ia32
  • /etc/lsb-release.d/core-3.0-noarch
  • /etc/lsb-release.d/graphics-3.0-ia32
  • /etc/lsb-release.d/graphics-3.0-noarch

而在 SLES9SP3 上只有以 graphics 开头的文件。仔细查看一下 /usr/bin/lsb_release的实现我们就会发现,所遵守的 LSB 规范的列表既可以保存在 /etc/lsb-release 文件中,也可以以文件的形式放到 /etc/lsb-release.d 目录中。因此 LSB 只是对接口定义进行了规范,但却没有限定具体的实现,这样既可以为发行版供应商提供充分的自由,又为应用程序开发人员提供了一致的接口,可以得到最大限度 的推广和应用。


转载:linux标准学习之-LSB(下)
转载:linux标准学习之-LSB(下)
转载:linux标准学习之-LSB(下)
转载:linux标准学习之-LSB(下)
回页首


结束语

标准化的 Linux 操作系统可以为应用程序开发者提供一个开发应用程序的良好平台,使他们开发的应用程序可以非常平滑地移植到其他发行版本上。LSB 通过定义一系列规范,并提供标准测试套件和开发环境,可以帮助开发人员更容易地开发遵守规范的应用程序,辅助供应商构建更标准的系统。在本系列的下一篇文 章中,我们将介绍如何使用 LSB 标准提供的测试工具来验证系统和应用程序是否遵守 LSB 规范。



参考资料

<think>好的,我现在需要帮助用户了解如何使用 arm-linux-gnueabihf 编译汇编语言代码。首先,我得回顾一下用户提供的引用内容,看看有没有相关的信息。根据引用[1]和[4],arm-linux-gnueabihf-gcc是交叉编译器,用于将代码编译成ARM架构的可执行文件。用户的问题是关于汇编语言的编译,可能需要使用特定的工具链命令。 接下来,我需要确定标准的编译流程。通常,汇编代码的编译过程包括汇编和链接两个步骤。对于GCC工具链来说,可能需要先使用as命令将汇编代码转换为目标文件,然后再用gcc进行链接。或者,是否可以直接使用arm-linux-gnueabihf-gcc来一步完成汇编和链接?需要确认这一点。 然后,我需要考虑示例代码的结构。用户需要一个简单的汇编程序作为例子,比如输出“Hello World”或者执行一个简单的系统调用。由于汇编语言直接与硬件交互,可能需要使用系统调用或者C库函数。例如,在ARM架构中,使用软中断(swi)来进行系统调用,或者链接到C库以便使用printf等函数。 另外,交叉编译时需要注意目标平台的ABI(应用二进制接口),比如是否使用硬浮点(hard-float),这已经体现在工具链的名称中(gnueabihf)。因此,在编译时需要确保正确的选项,例如-march和-mcpu等参数,以匹配目标ARM处理器的架构。 用户可能还会遇到常见问题,比如如何调试编译后的程序。引用[5]提到使用GDB Hardware Debugging,可能需要配置调试器连接到目标设备。不过用户的问题主要集中在编译过程,所以可能不需要深入调试部分,但可以简要提及。 最后,需要确保回答结构清晰,分步骤说明,并给出示例代码和命令。同时,生成相关问题,帮助用户进一步学习,比如优化编译选项、混合汇编与C代码等。</think>### arm-linux-gnueabihf 汇编语言编译教程 #### 1. 环境准备 首先确保已安装 `arm-linux-gnueabihf` 工具链。在Ubuntu/Debian系统中可通过以下命令安装: ```bash sudo apt-get install gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf ``` #### 2. 编写汇编代码 创建示例文件 `hello.s`,内容如下(ARM32架构汇编): ```assembly .global _start .section .text _start: mov r7, #4 @ syscall编号4(write) mov r0, #1 @ 文件描述符1(stdout) ldr r1, =msg @ 字符串地址 mov r2, #13 @ 字符串长度 swi 0 @ 触发软中断 mov r7, #1 @ syscall编号1(exit) mov r0, #0 @ 返回码0 swi 0 .section .data msg: .asciz "Hello ARM!\n" ``` #### 3. 编译与链接 分步操作: ```bash # 汇编为目标文件 arm-linux-gnueabihf-as -o hello.o hello.s # 链接为可执行文件 arm-linux-gnueabihf-ld -o hello hello.o # 或单步完成(汇编+链接) arm-linux-gnueabihf-gcc -nostdlib -o hello hello.s ``` #### 4. 文件验证 使用 `file` 命令检查文件类型: ```bash file hello # 应显示:ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked... ``` #### 5. 运行测试 将生成的可执行文件传输到ARM设备执行: ```bash scp hello user@arm-device:/tmp/ ssh user@arm-device "/tmp/hello" # 输出:Hello ARM! ``` #### 高级用法 - **混合汇编与C代码**:可通过内联汇编或单独编译后链接 ```c // main.c extern void asm_func(); int main() { asm_func(); return 0; } ``` ```bash arm-linux-gnueabihf-gcc -o combined main.c asm.s ``` - **优化编译选项**: ```bash arm-linux-gnueabihf-gcc -mcpu=cortex-a9 -mfpu=neon -o optimized hello.s ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值