14 64 位系统环境中的 32 位和 64 位应用程序 #
SUSE® Linux Enterprise Server 可用于多种 64 位平台。但是这并不表示内含的所有应用程序都已移植到 64 位平台上。SUSE Linux Enterprise Server 支持在 64 位系统环境中使用 32 位应用程序。本章简单介绍了如何在 64 位 SUSE Linux Enterprise Server 平台上实现这种支持。它解释了如何执行 32 位应用程序,以及应该如何编译 32 位应用程序,以使它们在 32 位和 64 位系统环境中都可运行。另外,您还可以了解有关内核 API 的信息和 32 位应用程序如何在 64 位内核下运行的解释。
用于 64 位平台 POWER、IBM Z 和 AMD64/Intel 64 的 SUSE Linux Enterprise Server 可让现有的 32 位应用程序“无需额外配置” 即可在 64 位环境中运行。相应的 32 位平台为:用于 POWER 的 ppc 和用于 AMD64/Intel 64 的 x86。。这种支持意味着您可以继续使用所需的 32 位应用程序,而无需等待对应的 64 位端口可用。当前的 POWER 系统以 32 位模式运行大多数应用程序,但您可以运行 64 位应用程序。
14.1 运行时支持 #
如果某个应用程序在 32 位和 64 位环境中都可用,则两个版本的并行安装必定会导致出现问题。在这种情况下,在两个版本中选一个,然后安装并使用这一版本。
此规则的一个例外是 PAM(可插入身份验证模块)。SUSE Linux Enterprise Server 在身份验证过程中使用 PAM 作为在用户和应用程序之间充当媒介的层。在另外还运行 32 位应用程序的 64 位操作系统上,始终需要安装两个版本的 PAM 模块。
若要正确执行,每个应用程序都需要一系列库。不巧的是,这些库的 32 位和 64 位版本的名称是相同的。必须通过另一种方法对它们加以区分。
为了保持与 32 位版本的兼容性,这些库在系统中的储存位置与在 32 位环境中相同。在 32 位和 64 位环境中,libc.so.6
的 32 位版本都位于 /lib/libc.so.6
下。
所有 64 位库和对象文件都位于名为 lib64
的目录中。通常预计会在 /lib
和 /usr/lib
下找到的 64 位对象文件,现在可以在 /lib64
和 /usr/lib64
下找到。这意味着 /lib
和 /usr/lib
下有储存 32 位库的空间,因此两个版本的文件名都可以保持不变。
如果 32 位 /lib
目录的子目录包含的数据内容不依赖于字大小,则不移动这些目录。此方案符合 LSB(Linux 标准库)和 FHS(文件系统层次标准)。
14.2 软件开发 #
所有 64 位体系结构都支持 64 位对象的开发。32 位编译的支持级别取决于体系结构。GCC(GNU 编译器集合)和 binutil(包括汇编器 as
和链接器 ld
)中的工具链有多个实施选项:
使用 biarch 开发工具链既可以生成 32 位对象,也可以生成 64 位对象。Biarch 开发工具链允许生成 32 位和 64 位对象。在几乎所有平台上,默认设置都是编译 64 位对象。如果使用特殊的标志,则可以生成 32 位对象。特殊标志是 -m32
(对于 GCC)。用于 binutils 的标志是依赖于体系结构的,但 GCC 将正确的标志传送到链接器和汇编器。Biarch 开发工具链当前可用于 amd64(支持 x86 和 amd64 指令的开发)、IBM Z 和 POWER。32 位对象通常是在 POWER 平台上创建的。-m64
标志用于生成 64 位对象。
必须以一种独立于体系结构的形式编写所有头文件。安装的 32 位和 64 位库必须具有与安装的头文件匹配的 API(应用程序编程接口)。普通 SUSE Linux Enterprise Server 环境是根据此原则设计的。如果是手动更新的库,请自行解决此问题。
14.3 Biarch 平台上的软件编译 #
若要在 Biarch 体系结构上为其他体系结构开发二进制代码,则必须另外安装用于第二个体系结构的各个库。这些包称为 rpmname-32bit
或 rpmname-x86
(如果第二个体系结构为 32 位体系结构),或者 rpmname-64bit
(如果第二个体系结构为 64 位体系结构)。您还需要 rpmname-devel
包中各自的报头和库以及 rpmname-devel-32bit
或 rpmname-devel-64bit
中用于第二个体系结构的开发库。
例如,要在第二个体系结构为 32 位(AMD64/Intel 64 或 IBM Z)的系统上编译使用 libaio
的程序,您需要以下 RPM:
- libaio-32bit
32 位运行时包
- libaio-devel-32bit
32 位开发的标题和库
- libaio
64 位运行时包
- libaio-devel
64 位开发的标题和库
大多数开放源代码程序使用基于 autoconf
的程序配置。若要使用 autoconf
配置第二个体系结构的程序,请通过运行带有附加环境变量的 configure
脚本覆盖 autoconf
的常规编译器和链接器设置。
下面的示例针对的是使用 x86 作为第二个体系结构的 AMD64/Intel 64 系统:第二个体系结构为 ppc 的 POWER 与此类似。
使用 32 位编译器:
CC="gcc -m32"
指示链接器处理 32 位对象(始终使用
gcc
作为链接器前端):LD="gcc -m32"
设置组装器生成 32 位对象:
AS="gcc -c -m32"
指定链接器标志,如 32 位库的位置,例如:
LDFLAGS="-L/usr/lib"
指定 32 位对象代码库的位置:
--libdir=/usr/lib
指定 32 位 X 库的位置:
--x-libraries=/usr/lib
并不是每个程序都需要这些变量。根据各个程序对这些变量进行调整。
以下是在 AMD64/Intel 64、POWER 或 IBM Z 上编译本机 32 位应用程序的 configure
调用示例:
CC="gcc -m32" LDFLAGS="-L/usr/lib;" ./configure --prefix=/usr --libdir=/usr/lib --x-libraries=/usr/lib make make install
14.4 内核规范 #
AMD64/Intel 64、POWER 和 IBM Z 适用的 64 位内核提供 64 位和 32 位两种内核 ABI(应用程序二进制接口)。后者与对应的 32 位内核的 ABI 相同。这意味着 32 位应用程序可以以与 32 位内核交流的相同方式与 64 位内核进行交流。
64 位内核系统调用的 32 位仿真不支持系统程序使用的某些 API。这取决于平台。出于此原因,少数应用程序(例如 lspci
)必须在非 POWER 平台上编译为 64 位程序才能正常运行。在 IBM Z 上,并非所有 ioctl 都可在 32 位内核 ABI 中使用。
64 位内核只能装载专门为此内核编译的 64 位内核模块。不能使用 32 位内核模块。
某些应用程序需要单独的内核可装载模块。如果要在 64 位系统环境中使用此类 32 位应用程序,请与此应用程序的提供商和 SUSE 联系以确保内核可装载模块的 64 位版本和内核 API 的 32 位编译版本可用于此模块。