perlaix - IBM AIX (UNIX) 系统上的 Perl 5 版本
本文档描述了 IBM 的 UNIX 操作系统 AIX 的各种特性,这些特性会影响 Perl 5 版本(以下简称 Perl)的编译和/或运行方式。
有关在旧版 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 AIX 或 IBM 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 < 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 | 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),则使用最后一个可用的支持级别。
从 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++ 代码,这在使用模拟接口时是不可能的。
强烈建议使用新接口。
应该不会出现问题。
在 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 不兼容。
如果您的 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 中的一个回归导致在夏令时期间 Time::Piece 中的 make test 失败。APAR IV16514 提供了此问题的修复。假设当前是东部时间夏令时,可以运行 TZ=EST5 date +%Z
来快速测试是否需要此修复。这通常会返回 EST
,但如果存在问题,则不会返回任何内容。
由于 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 编译器,需要付费:xlC 和 vac。如果您决定使用这两个编译器中的任何一个(这比使用 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 支持动态加载对象和共享库。按照惯例,共享库以 .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++ 代码,这在使用模拟接口时是不可能的。
可以使用 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”,并按照说明操作。
如果链接 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
工具的使用方式。
使用 gcc-3.x(在 3.0.4、3.1 和 3.2 上测试)现在可以开箱即用,最近的 gcc-2.9 版本也可以直接从 IBM 获得,作为其 Linux 兼容性包的一部分,可在此处获得
http://www.ibm.com/servers/aix/products/aixos/linux/
应该不会出现问题。
线程似乎可以正常工作,尽管目前在使用线程与 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() 的可重入变体与非可重入变体具有略微不同的原型引起的,但这种差异在这里并不重要。
如果您的 AIX 安装了 64 位支持,您可以预期 64 位配置可以正常工作。与线程结合使用时,某些测试可能仍然失败。
在 AIX 4.2 中,使用 C++ 函数(使用静态变量)的 Perl 扩展可能会遇到问题,因为静态变量没有被初始化。在较新的 AIX 版本中,这个问题已通过将 Perl 与 libC_r 库链接来解决,但不幸的是,在 AIX 4.2 中,该库存在一个难以理解的错误,导致与时间相关的各种函数(如 time() 和 gettimeofday())返回错误的值,因此在 AIX 4.2 中,Perl 没有与 libC_r 链接。
Rainer Tammer <[email protected]>