内容

名称

perlaix - IBM AIX (UNIX) 系统上的 Perl 5 版本

描述

本文档描述了 IBM 的 UNIX 操作系统 AIX 的各种特性,这些特性会影响 Perl 5 版本(以下简称 Perl)的编译和/或运行方式。

在 AIX 上编译 Perl 5

有关在旧版 AIX 上编译器的信息,请参阅 "在 4.3.3 之前的旧版 AIX 版本上编译 Perl 5"

编译 Perl 时,必须使用 ANSI C 编译器。AIX 默认情况下不随 AIX 提供 ANSI 兼容的 C 编译器,但 AIX 的 gcc 二进制版本广泛可用。AIX 工具箱中也包含 gcc 版本,该工具箱随 AIX 提供。

支持的编译器

目前,所有版本的 IBM "xlc"、"xlc_r"、"cc"、"cc_r" 或 "vac" ANSI/C 编译器都可以在您的系统上工作,则可以用于构建 Perl。

如果您计划将 Perl 链接到任何需要线程支持的模块,例如 DBD::Oracle,最好使用编译器的 _r 版本。这不会构建一个线程化的 Perl,而是一个支持线程的 Perl。另请参阅后面的 "线程化的 Perl"

截至撰写本文时(2010-09),IBM 在 AIX 5L/6.1/7.1 上仅支持 IBM XL C for AIXIBM XL C/C++ for AIX 编译器。

以下编译器版本目前受 IBM 支持

IBM XL C and IBM XL C/C++ V8, V9, V10, V11

XL C for AIX 集成在 XL C/C++ for AIX 编译器中,因此也受支持。

如果您选择 XL C/C++ V9,则需要安装 APAR IZ35785,否则由于优化错误,集成的 SDBM_File 无法正确编译。您可以通过在优化标志 (-Doptimize='-O -qipa') 中添加 -qipa 来规避此问题。解决此问题的 APAR IZ35785 的 PTF 可从 IBM 获得(2009 年 4 月针对 AIX 的 XL C/C++ 企业版 V9.0 的 PTF)。

如果您选择 XL C/C++ V11,则需要安装 2010 年 4 月的 PTF(或更新版本),否则您将无法获得可用的 Perl 版本。

Perl 可以使用 IBM 的 ANSI C 编译器或 gcc 编译。建议使用前者,因为它不仅可以毫无困难地编译 Perl,而且还可以利用后面列出的需要使用 IBM 编译器特定命令行标志的功能。

如果您决定使用 gcc,请确保您的安装是最新且完整的,并确保阅读 Perl INSTALL 文件以获取更多 gcc 特定的详细信息。请将您必须跳过的任何障碍报告给开发团队。

与 AIX 工具箱 lib gdbm 的不兼容性

如果您的系统上安装了 AIX 工具箱版本的 lib gdbm < 1.8.3-5,则 Perl 将无法工作。此库包含与 AIX 系统版本冲突的头文件 /opt/freeware/include/gdbm/dbm.h|ndbm.h。如果检测到这两个头文件中的一个,则 lib gdbm 将从所需库中自动删除。如果您想使用 GDBM 支持构建 Perl,请至少安装 gdbm-devel-1.8.3-5(或更高版本)。

Perl 5 已在以下系统上成功编译和测试

Perl   | AIX Level           | Compiler Level          | w th | w/o th
-------+---------------------+-------------------------+------+-------
5.12.2 |5.1 TL9 32 bit       | XL C/C++ V7             | OK   | OK
5.12.2 |5.1 TL9 64 bit       | XL C/C++ V7             | OK   | OK
5.12.2 |5.2 TL10 SP8 32 bit  | XL C/C++ V8             | OK   | OK
5.12.2 |5.2 TL10 SP8 32 bit  | gcc 3.2.2               | OK   | OK
5.12.2 |5.2 TL10 SP8 64 bit  | XL C/C++ V8             | OK   | OK
5.12.2 |5.3 TL8 SP8 32 bit   | XL C/C++ V9 + IZ35785   | OK   | OK
5.12.2 |5.3 TL8 SP8 32 bit   | gcc 4.2.4               | OK   | OK
5.12.2 |5.3 TL8 SP8 64 bit   | XL C/C++ V9 + IZ35785   | OK   | OK
5.12.2 |5.3 TL10 SP3 32 bit  | XL C/C++ V11 + Apr 2010 | OK   | OK
5.12.2 |5.3 TL10 SP3 64 bit  | XL C/C++ V11 + Apr 2010 | OK   | OK
5.12.2 |6.1 TL1 SP7 32 bit   | XL C/C++ V10            | OK   | OK
5.12.2 |6.1 TL1 SP7 64 bit   | XL C/C++ V10            | OK   | OK
5.13   |7.1 TL0 SP1 32 bit   | XL C/C++ V11 + Jul 2010 | OK   | OK
5.13   |7.1 TL0 SP1 64 bit   | XL C/C++ V11 + Jul 2010 | OK   | OK

w th   = with thread support
w/o th = without thread support
OK     = tested

成功测试意味着所有“make test”运行都以 100% OK 的结果结束。所有测试均在 -Duseshrplib 设置的情况下进行。

所有测试都在支持的 AIX 技术级别中最旧的版本上进行,并应用了最新的支持包。如果测试的 AIX 版本已超出支持范围(AIX 4.3.3、5.1、5.2),则使用最后一个可用的支持级别。

在 AIX 上构建动态扩展

从 Perl 5.7.2(以及随后的 5.8.x / 5.10.x / 5.12.x)和 AIX 4.3 或更新版本开始,Perl 使用 AIX 本机动态加载接口,称为运行时链接模式,而不是在 Perl 5.6.1 及更早版本中使用的模拟接口,或在 AIX 4.2 及更早版本中使用的模拟接口。此更改确实破坏了与早期 Perl 版本编译的模块的向后兼容性。进行此更改是为了使 Perl 更加符合其他应用程序,例如使用 AIX 本机接口的 Apache/mod_perl。此更改还允许在 Perl 扩展中使用具有静态构造函数和析构函数的 C++ 代码,这在使用模拟接口时是不可能的。

强烈建议使用新接口。

使用 Perl 处理大文件

应该不会出现问题。

多线程 Perl

在 AIX 5.1 / 5.2 / 5.3 / 6.1 / 7.1 上应该不会出现问题。

IBM 在一些 AIX 系统脚本中使用 AIX 系统 Perl(AIX 5.1 上的 V5.6.0,AIX 5.2 / 5.3 和 6.1 上的 V5.8.2;AIX 5.3 TL11 和 AIX 6.1 TL4 上的 V5.8.8;AIX 7.1 上的 V5.10.1)。如果您将 /usr/bin 中的链接从 AIX 系统 Perl (/usr/opt/perl5) 切换到新构建的 Perl,那么如果您使用多线程选项,您将获得与 IBM AIX 系统 Perl 相同的功能。

多线程 Perl 构建也适用于 AIX 5.1,但 IBM Perl 构建(Perl v5.6.0)在 AIX 5.1 上不是多线程的。

Perl 5.12 及更新版本与 IBM 文件集 perl.libext 不兼容。

64 位 Perl

如果您的 AIX 系统安装了 64 位支持,您可以预期 64 位配置可以正常工作。如果您想在 AIX 6.1 上使用 64 位 Perl,您需要一个针对 libc.a 错误的 APAR,该错误会影响 (n)dbm_XXX 函数。此问题的 APAR 号码为 IZ39077。

如果您需要更多内存(更大的数据段)用于您的 Perl 程序,您可以设置

/etc/security/limits
default:                    (or your user)
    data = -1               (default is 262144 * 512 byte)

使用默认设置,大小限制为 128MB。-1 会移除此限制。如果“make test”失败,请更改您的 /etc/security/limits,如上所述。

长双精度

IBM 将其长双精度实现称为 128 位,但它不是 IEEE 128 位(“四倍精度”),这将提供 116 位的尾数(也不在硬件中实现),而是一种称为“双双”的特殊软件实现,它提供了 106 位的尾数。

这种长双精度实现似乎存在各种问题。如果 Configure 检测到此问题,它将禁用长双精度支持。这可以通过显式 -Duselongdouble(或 -Dusemorebits,它同时启用长双精度和 64 位整数)来覆盖。如果您决定启用长双精度,对于大多数有问题的部分,Perl 已经实现了解决方法,但对特殊值无穷大和 NaN 的处理仍然存在严重问题:例如,无穷大加零会导致 NaN。

使用以下选项,您可以获得一个线程化的 Perl 版本,它在线程化的 32 位模式下通过所有 make 测试,这是 AIX 附带的 Perl 构建的默认配置。

rm config.sh
./Configure \
-d \
-Dcc=cc_r \
-Duseshrplib \
-Dusethreads \
-Dprefix=/usr/opt/perl5_32

-Dprefix 选项将把 Perl 安装到与 IBM AIX 系统 Perl 安装并行的目录中。

使用以下选项,您可以获得一个在 32 位模式下通过所有 make 测试的 Perl 版本。

rm config.sh
./Configure \
-d \
-Dcc=cc_r \
-Duseshrplib \
-Dprefix=/usr/opt/perl5_32

-Dprefix 选项将把 Perl 安装到与 IBM AIX 系统 Perl 安装并行的目录中。

使用以下选项,您可以获得一个在 64 位模式下通过所有 make 测试的线程化的 Perl 版本。

export OBJECT_MODE=64 / setenv OBJECT_MODE 64 (depending on your shell)

rm config.sh
./Configure \
-d \
-Dcc=cc_r \
-Duseshrplib \
-Dusethreads \
-Duse64bitall \
-Dprefix=/usr/opt/perl5_64

使用以下选项,您可以获得一个在 64 位模式下通过所有 make 测试的 Perl 版本。

export OBJECT_MODE=64 / setenv OBJECT_MODE 64 (depending on your shell)

rm config.sh
./Configure \
-d \
-Dcc=cc_r \
-Duseshrplib \
-Duse64bitall \
-Dprefix=/usr/opt/perl5_64

-Dprefix 选项将把 Perl 安装到与 IBM AIX 系统 Perl 安装并行的目录中。

如果您选择 gcc 来编译 64 位 Perl,那么您需要添加以下选项

-Dcc='gcc -maix64'

在 AIX 7.1.0 上编译 Perl 5

AIX 7 中的一个回归导致在夏令时期间 Time::Piece 中的 make test 失败。APAR IV16514 提供了此问题的修复。假设当前是东部时间夏令时,可以运行 TZ=EST5 date +%Z 来快速测试是否需要此修复。这通常会返回 EST,但如果存在问题,则不会返回任何内容。

在 AIX 4.3.3 之前的旧版 AIX 版本上编译 Perl 5

由于 AIX 4.3.3 于 2003 年 12 月 31 日停止服务,因此提供此信息仅供参考。在 AIX 4.3.3 上编译 Perl 5.8.9 之前的 Perl 版本可以使用以下设置(结果可能会有所不同)。

编译 Perl 时,必须使用 ANSI C 编译器。AIX 默认情况下不附带 ANSI 兼容的 C 编译器,但 AIX 的 gcc 二进制构建版本广泛可用。

在撰写本文时,AIX 支持两种不同的原生 C 编译器,需要付费:xlCvac。如果您决定使用这两个编译器中的任何一个(这比使用 gcc 方便得多),请确保升级到最新的可用补丁级别。目前

xlC.C     3.1.4.10 or 3.6.6.0 or 4.0.2.2 or 5.0.2.9 or 6.0.0.3
vac.C     4.4.0.3  or 5.0.2.6 or 6.0.0.1

请注意,从 4.0.2.0 版本开始,xlC 的名称中包含操作系统版本,因此您会发现 xlC.C 作为 AIX-5.0 的包

xlC.aix50.rte   5.0.2.0 or 6.0.0.3

子版本在所有操作系统版本上并不都是相同的“最新”。例如,aix41 上的最新 xlC-5 是 5.0.2.9,而在 aix43 上,它是 5.0.2.7。

Perl 可以使用 IBM 的 ANSI C 编译器或 gcc 编译。建议使用前者,因为它不仅可以轻松编译 Perl,而且还可以利用后面列出的需要使用 IBM 编译器特定命令行标志的功能。

IBM 编译器的补丁级别 5.0.0.0 和 5.0.1.0 存在影响 perl.c 和 regcomp.c 编译的编译器优化错误。如果 Perl 的配置检测到这些编译器补丁级别,则会为上述源代码文件关闭优化。建议升级到至少 5.0.2.0。

如果您决定使用 gcc,请确保您的安装是最新且完整的,并确保阅读 Perl INSTALL 文件以获取更多 gcc 特定的详细信息。请将您必须跳过的任何障碍报告给开发团队。

操作系统级别

在将补丁安装到 IBM C 编译器之前,您需要了解操作系统的补丁级别。IBM 的命令 'oslevel' 将显示基本级别,但并不总是完整的(在本例中,oslevel 显示 4.3.NULL,而系统可能运行大部分 4.3.THREE)

# oslevel
4.3.0.0
# lslpp -l | grep 'bos.rte '
bos.rte           4.3.3.75  COMMITTED  Base Operating System Runtime
bos.rte            4.3.2.0  COMMITTED  Base Operating System Runtime
#

AIX 5.1 或其他操作系统级别也可能出现这种情况。作为旁注,如果没有安装 bos.adt.syscalls 和 bos.adt.libm,则无法构建 Perl。

# lslpp -l | egrep "syscalls|libm"
bos.adt.libm      5.1.0.25  COMMITTED  Base Application Development
bos.adt.syscalls  5.1.0.36  COMMITTED  System Calls Application
#

在 AIX < 5L 上构建动态扩展

AIX 支持动态加载对象和共享库。按照惯例,共享库以 .a 后缀结尾,这有点误导,因为存档可以包含静态和动态成员。对于 Perl 动态加载对象,我们使用 .so 后缀,该后缀也用于许多其他平台。

请注意,从 Perl 5.7.2(以及随之而来的 5.8.0)和 AIX 4.3 或更高版本开始,Perl 使用 AIX 本机动态加载接口(在所谓的运行时链接模式下),而不是 Perl 5.6.1 及更早版本或 AIX 4.2 及更早版本中使用的模拟接口。此更改确实会破坏与早期 Perl 版本编译的模块的向后兼容性。进行此更改是为了使 Perl 更加符合其他应用程序(如 Apache/mod_perl),这些应用程序使用 AIX 本机接口。此更改还允许在 Perl 扩展中使用具有静态构造函数和析构函数的 C++ 代码,这在使用模拟接口时是不可能的。

IBM ANSI C 编译器

可以使用 Configure 的所有默认值。

如果您选择使用 vac 4,请确保运行 4.4.0.3。较旧的版本将在以后出现问题。对于 vac 5,请确保至少运行 5.0.1.0,但强烈建议使用 vac 5.0.2.6 或更高版本。请注意,由于 IBM 已从软件库中删除了 vac 5.0.2.1 到 5.0.2.5,因此这些版本应被视为已过时。

以下是如何将编译器升级到最新级别的简要说明。当然,这可能会发生变化。您只能从 ftp 可用的更新中升级版本,前提是前三位数字组相同(在这种情况下,您可以跳过中间版本,与 Perl 开发者快照中的补丁不同),或者升级到一个版本,其中“基础”版本可用。换句话说,AIX 编译器补丁是累积的。

vac.C.4.4.0.1 => vac.C.4.4.0.3  is OK     (vac.C.4.4.0.2 not needed)
xlC.C.3.1.3.3 => xlC.C.3.1.4.10 is NOT OK (xlC.C.3.1.4.0 is not
                                                             available)

# ftp ftp.software.ibm.com
Connected to service.boulder.ibm.com.
: welcome message ...
Name (ftp.software.ibm.com:merijn): anonymous
331 Guest login ok, send your complete e-mail address as password.
Password:
... accepted login stuff
ftp> cd /aix/fixes/v4/
ftp> dir other other.ll
output to local-file: other.ll? y
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
226 Transfer complete.
ftp> dir xlc xlc.ll
output to local-file: xlc.ll? y
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
226 Transfer complete.
ftp> bye
... goodbye messages
# ls -l *.ll
-rw-rw-rw-   1 merijn   system    1169432 Nov  2 17:29 other.ll
-rw-rw-rw-   1 merijn   system      29170 Nov  2 17:29 xlc.ll

在 AIX 4.2 上使用 xlC,我们继续

# lslpp -l | fgrep 'xlC.C '
  xlC.C                     3.1.4.9  COMMITTED  C for AIX Compiler
  xlC.C                     3.1.4.0  COMMITTED  C for AIX Compiler
# grep 'xlC.C.3.1.4.*.bff' xlc.ll
-rw-r--r--   1 45776101 1       6286336 Jul 22 1996  xlC.C.3.1.4.1.bff
-rw-rw-r--   1 45776101 1       6173696 Aug 24 1998  xlC.C.3.1.4.10.bff
-rw-r--r--   1 45776101 1       6319104 Aug 14 1996  xlC.C.3.1.4.2.bff
-rw-r--r--   1 45776101 1       6316032 Oct 21 1996  xlC.C.3.1.4.3.bff
-rw-r--r--   1 45776101 1       6315008 Dec 20 1996  xlC.C.3.1.4.4.bff
-rw-rw-r--   1 45776101 1       6178816 Mar 28 1997  xlC.C.3.1.4.5.bff
-rw-rw-r--   1 45776101 1       6188032 May 22 1997  xlC.C.3.1.4.6.bff
-rw-rw-r--   1 45776101 1       6191104 Sep  5 1997  xlC.C.3.1.4.7.bff
-rw-rw-r--   1 45776101 1       6185984 Jan 13 1998  xlC.C.3.1.4.8.bff
-rw-rw-r--   1 45776101 1       6169600 May 27 1998  xlC.C.3.1.4.9.bff
# wget ftp://ftp.software.ibm.com/aix/fixes/v4/xlc/xlC.C.3.1.4.10.bff
#

在 AIX 4.3 上使用 vac,我们继续

# lslpp -l | grep 'vac.C '
 vac.C                      5.0.2.2  COMMITTED  C for AIX Compiler
 vac.C                      5.0.2.0  COMMITTED  C for AIX Compiler
# grep 'vac.C.5.0.2.*.bff' other.ll
-rw-rw-r--   1 45776101 1       13592576 Apr 16 2001  vac.C.5.0.2.0.bff
-rw-rw-r--   1 45776101 1       14133248 Apr  9 2002  vac.C.5.0.2.3.bff
-rw-rw-r--   1 45776101 1       14173184 May 20 2002  vac.C.5.0.2.4.bff
-rw-rw-r--   1 45776101 1       14192640 Nov 22 2002  vac.C.5.0.2.6.bff
# wget ftp://ftp.software.ibm.com/aix/fixes/v4/other/vac.C.5.0.2.6.bff
#

同样在所有其他操作系统级别上。然后执行以下命令,并填写其选项

# smit install_update
 -> Install and Update from LATEST Available Software
 * INPUT device / directory for software [ vac.C.5.0.2.6.bff    ]
 [ OK ]
 [ OK ]

按照消息... 然后就完成了。

如果您喜欢更像 Web 的方法,一个好的起点可以是 http://www14.software.ibm.com/webapp/download/downloadaz.jsp,然后点击“C for AIX”,并按照说明操作。

usenm 选项

如果链接 miniperl

cc -o miniperl ... miniperlmain.o opmini.o perl.o ... -lm -lc ...

导致类似这样的错误

ld: 0711-317 ERROR: Undefined symbol: .aintl
ld: 0711-317 ERROR: Undefined symbol: .copysignl
ld: 0711-317 ERROR: Undefined symbol: .syscall
ld: 0711-317 ERROR: Undefined symbol: .eaccess
ld: 0711-317 ERROR: Undefined symbol: .setresuid
ld: 0711-317 ERROR: Undefined symbol: .setresgid
ld: 0711-317 ERROR: Undefined symbol: .setproctitle
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more
                                                           information.

您可以使用以下命令重试

make realclean
rm config.sh
./Configure -Dusenm ...

这使得 Configure 在扫描库符号时使用 nm 工具,这通常在 AIX 中不会发生。

与此相关的是,您可能不应该在 AIX 中使用 Configure 的 -r 选项,因为这会影响 nm 工具的使用方式。

使用 GNU 的 gcc 构建 Perl

使用 gcc-3.x(在 3.0.4、3.1 和 3.2 上测试)现在可以开箱即用,最近的 gcc-2.9 版本也可以直接从 IBM 获得,作为其 Linux 兼容性包的一部分,可在此处获得

http://www.ibm.com/servers/aix/products/aixos/linux/

在 Perl < 5L 中使用大文件

应该不会出现问题。

线程化 Perl < 5L

线程似乎可以正常工作,尽管目前在使用线程与 64 位配置结合时,并非所有测试都能通过。

在进行线程化构建时,您可能会收到警告

"pp_sys.c", line 4640.39: 1506-280 (W) Function argument assignment 
between types "unsigned char*" and "const void*" is not allowed.

确切的行号可能会有所不同,但如果警告 (W) 来自类似这样的行

hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);

在 "pp_ghostent" 函数中,您可以安全地忽略它。警告是由 gethostbyaddr() 的可重入变体与非可重入变体具有略微不同的原型引起的,但这种差异在这里并不重要。

64 位 Perl < 5L

如果您的 AIX 安装了 64 位支持,您可以预期 64 位配置可以正常工作。与线程结合使用时,某些测试可能仍然失败。

AIX 4.2 和使用 C++ 静态变量的扩展

在 AIX 4.2 中,使用 C++ 函数(使用静态变量)的 Perl 扩展可能会遇到问题,因为静态变量没有被初始化。在较新的 AIX 版本中,这个问题已通过将 Perl 与 libC_r 库链接来解决,但不幸的是,在 AIX 4.2 中,该库存在一个难以理解的错误,导致与时间相关的各种函数(如 time() 和 gettimeofday())返回错误的值,因此在 AIX 4.2 中,Perl 没有与 libC_r 链接。

作者

Rainer Tammer <[email protected]>