内容

名称

perlhpux - Perl 版本 5 在惠普 Unix (HP-UX) 系统上

描述

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

使用 HP-UX 附带的 perl

2001 年 9 月发布的应用程序 HP-UX 11.00 是第一个附带 Perl 的版本。当时是 /opt/perl 中的 perl-5.6.1。首次出现是在 CD 5012-7954 上,可以使用以下命令进行安装

swinstall -s /cdrom perl

假设您已将该 CD 装载到 /cdrom 上。

该版本是一个便携式 hppa-1.1 多线程版本,支持使用 gcc-2.9-hppa-991112 编译的大文件。

如果您执行新安装,则会自动安装(较新的)Perl。预装的 HP-UX 系统现在具有更新版本的 Perl 和更新的模块。

HP 的官方(线程)版本(在应用程序 DVD/CD 上附带)可在 http://www.software.hp.com/portal/swdepot/displayProductInfo.do?productNumber=PERL 上获得,适用于 PA-RISC 和 IPF(安腾处理器系列)。它们是使用 HP ANSI-C 编译器构建的。在 5.8.8 之前,此操作是由 ActiveState 完成的。

要查看 DVD 上包含的版本(此处假定已装载到 /cdrom 上),请发出此命令

# swlist -s /cdrom perl
# perl           D.5.8.8.B  5.8.8 Perl Programming Language
  perl.Perl5-32  D.5.8.8.B  32-bit 5.8.8 Perl Programming Language
                                         with Extensions
  perl.Perl5-64  D.5.8.8.B  64-bit 5.8.8 Perl Programming Language
                                         with Extensions

要查看系统上安装的内容

# swlist -R perl
# perl                    E.5.8.8.J  Perl Programming Language
# perl.Perl5-32           E.5.8.8.J  32-bit Perl Programming Language
                                     with Extensions
  perl.Perl5-32.PERL-MAN  E.5.8.8.J  32-bit Perl Man Pages for IA
  perl.Perl5-32.PERL-RUN  E.5.8.8.J  32-bit Perl Binaries for IA
# perl.Perl5-64           E.5.8.8.J  64-bit Perl Programming Language
                                     with Extensions
  perl.Perl5-64.PERL-MAN  E.5.8.8.J  64-bit Perl Man Pages for IA
  perl.Perl5-64.PERL-RUN  E.5.8.8.J  64-bit Perl Binaries for IA

使用 HP 移植中心的 perl

HP 移植中心努力满足客户需求,并发布开源社区的更新。提供预编译的 Perl 二进制文件是显而易见的,尽管“最新”是相对的。在撰写本文时,perl-5.10.1 和 5.28.0 可用。

HP 移植中心在允许移植到的系统方面受到限制,它们通常选择两个最新的可用操作系统版本。

HP 已要求移植中心将开源二进制文件从 /opt 移至 /usr/local,因此自 2002 年 7 月初以来生成的二进制文件位于 /usr/local 中。

HP 移植中心 URL 之一为 http://hpux.connect.org.uk/ 当前可用的端口是使用 GNU gcc 构建的。由于在 HP-UX 上移植现代 GNU gcc 极其困难,因此它们停留在 gcc-4.2.3 版本。

其他预构建的 perl 二进制文件

要获取适用于整个 HP-UX 系列的更多 perl 仓库,请访问 H.Merijn Brand 的网站 http://mirrors.develooper.com/hpux/#Perl。仔细阅读注释,以了解可用版本是否满足您的需求。

在 HP-UX 上编译 Perl 5

在编译 Perl 时,您必须使用 ANSI C 编译器。所有 HP-UX 系统附带的 C 编译器是 K&R 编译器,它只应用于构建新内核。

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

如果您决定使用 gcc,请确保您的安装是最新且完整的,并且务必阅读 Perl INSTALL 文件以了解更具体的 gcc 详细信息。

PA-RISC

PA-RISC 的最后一个最终版本是 2.0,惠普不再销售任何带有这些 CPU 的系统。

惠普的 HP9000 Unix 系统在惠普自己的精确架构 (PA-RISC) 芯片上运行。HP-UX 过去在摩托罗拉 MC68000 系列芯片上运行,但任何装有此芯片的机器都已相当过时,本文档不会尝试解决在摩托罗拉芯片组上编译 Perl 的问题。尽管 PA-RISC 硬件不再销售,但仍可以在野外找到许多仍在这些 CPU 上运行的机器。

HP 9000 系统的最后订购日期是 2008 年 12 月 31 日。

惠普 PA-RISC 系统通常称为型号描述“HP 9000”。此系列中的最后一个 CPU 是 PA-8900。对 PA-RISC 架构机器的支持已正式结束,如下表所示

  PA-RISC End-of-Life Roadmap
+--------+----------------+----------------+-----------------+
| HP9000 | Superdome      | PA-8700        | Spring 2011     |
| 4-128  |                | PA-8800/sx1000 | Summer 2012     |
| cores  |                | PA-8900/sx1000 | 2014            |
|        |                | PA-8900/sx2000 | 2015            |
+--------+----------------+----------------+-----------------+
| HP9000 | rp7410, rp8400 | PA-8700        | Spring 2011     |
| 2-32   | rp7420, rp8420 | PA-8800/sx1000 | 2012            |
| cores  | rp7440, rp8440 | PA-8900/sx1000 | Autumn 2013     |
|        |                | PA-8900/sx2000 | 2015            |
+--------+----------------+----------------+-----------------+
| HP9000 | rp44x0         | PA-8700        | Spring 2011     |
| 1-8    |                | PA-8800/rp44x0 | 2012            |
| cores  |                | PA-8900/rp44x0 | 2014            |
+--------+----------------+----------------+-----------------+
| HP9000 | rp34x0         | PA-8700        | Spring 2011     |
| 1-4    |                | PA-8800/rp34x0 | 2012            |
| cores  |                | PA-8900/rp34x0 | 2014            |
+--------+----------------+----------------+-----------------+

/usr/sam/lib/mo/sched.models 文件中包含操作系统构建时的完整型号列表。第一列对应于“model”命令输出的最后一部分。第二列是 PA-RISC 版本,第三列是使用的确切芯片类型。(从底部开始浏览以避免混淆 ;-)

# model
9000/800/L1000-44
# grep L1000-44 /usr/sam/lib/mo/sched.models
L1000-44        2.0     PA8500

PA-RISC 1.0

PA-RISC 的原始版本,惠普不再销售任何带有此芯片的系统。

以下系统包含 PA-RISC 1.0 芯片

600, 635, 645, 808, 815, 822, 825, 832, 834, 835, 840, 842, 845, 850,
852, 855, 860, 865, 870, 890

PA-RISC 1.1

对 PA-RISC 设计的升级,它在许多不同的系统中使用了许多年。

以下系统包含 PA-RISC 1.1 芯片

705, 710, 712, 715, 720, 722, 725, 728, 730, 735, 742, 743, 744, 745,
747, 750, 755, 770, 777, 778, 779, 800, 801, 803, 806, 807, 809, 811,
813, 816, 817, 819, 821, 826, 827, 829, 831, 837, 839, 841, 847, 849,
851, 856, 857, 859, 867, 869, 877, 887, 891, 892, 897, A180, A180C,
B115, B120, B132L, B132L+, B160L, B180L, C100, C110, C115, C120,
C160L, D200, D210, D220, D230, D250, D260, D310, D320, D330, D350,
D360, D410, DX0, DX5, DXO, E25, E35, E45, E55, F10, F20, F30, G30,
G40, G50, G60, G70, H20, H30, H40, H50, H60, H70, I30, I40, I50, I60,
I70, J200, J210, J210XC, K100, K200, K210, K220, K230, K400, K410,
K420, S700i, S715, S744, S760, T500, T520

PA-RISC 2.0

对 PA-RISC 设计的最新升级,它增加了对 64 位整数数据的支持。

截至本文档上次更新之日,以下系统包含 PA-RISC 2.0 芯片

700, 780, 781, 782, 783, 785, 802, 804, 810, 820, 861, 871, 879, 889,
893, 895, 896, 898, 899, A400, A500, B1000, B2000, C130, C140, C160,
C180, C180+, C180-XP, C200+, C400+, C3000, C360, C3600, CB260, D270,
D280, D370, D380, D390, D650, J220, J2240, J280, J282, J400, J410,
J5000, J5500XM, J5600, J7000, J7600, K250, K260, K260-EG, K270, K360,
K370, K380, K450, K460, K460-EG, K460-XP, K470, K570, K580, L1000,
L2000, L3000, N4000, R380, R390, SD16000, SD32000, SD64000, T540,
T600, V2000, V2200, V2250, V2500, V2600

就在惠普收购康柏之前,一些系统被重新命名。包含解释的链接已失效,因此这里有一个简短的摘要

HP 9000 A-Class servers, now renamed HP Server rp2400 series.
HP 9000 L-Class servers, now renamed HP Server rp5400 series.
HP 9000 N-Class servers, now renamed HP Server rp7400.

rp2400, rp2405, rp2430, rp2450, rp2470, rp3410, rp3440, rp4410,
rp4440, rp5400, rp5405, rp5430, rp5450, rp5470, rp7400, rp7405,
rp7410, rp7420, rp7440, rp8400, rp8420, rp8440, Superdome

当前的命名约定是

aadddd
||||`+- 00 - 99 relative capacity & newness (upgrades, etc.)
|||`--- unique number for each architecture to ensure different
|||     systems do not have the same numbering across
|||     architectures
||`---- 1 - 9 identifies family and/or relative positioning
||
|`----- c = ia32 (cisc)
|       p = pa-risc
|       x = ia-64 (Itanium & Itanium 2)
|       h = housing
`------ t = tower
        r = rack optimized
        s = super scalable
        b = blade
        sa = appliance

PA-RISC 版本之间的可移植性

在 PA-RISC 2.0 平台上编译的可执行文件不能在 PA-RISC 1.1 平台上执行,即使它们运行的是同一版本的 HP-UX。如果您在 PA-RISC 2.0 平台上构建 Perl,并且希望该 Perl 也可以在 PA-RISC 1.1 上运行,则应使用编译器标志 +DAportable 和 +DS32。

现在不可能在 PA-RISC 1.1 或 2.0 平台上编译 PA-RISC 1.0 可执行文件。命令行标志是可以接受的,但当可执行文件传输到 PA-RISC 1.0 系统时,它将无法运行。

安腾处理器系列 (IPF) 和 HP-UX

HP-UX 也可在较新的安腾处理器上运行。这需要使用 HP-UX 版本 11.23 (11i v2) 或 11.31 (11i v3),并且除了下面和后面部分中详述的少数差异之外,Perl 应该可以顺利编译。

尽管 PA-RISC 二进制文件可以在安腾系统上运行,但您不应该尝试在安腾系统上使用 PA-RISC 版本的 Perl。这是因为在安腾系统上创建的共享库无法在运行 PA-RISC 可执行文件时加载。

HP 安腾 2 系统通常被称为型号描述“HP Integrity”。

安腾、安腾 2 和 Madison 6

HP 还提供配备 128 位安腾处理器的服务器。据说 cx26x0 具有 Madison 6。截至本文档上次更新之日,以下系统包含安腾或安腾 2 芯片(这可能已过时)

BL60p, BL860c, BL870c, BL890c, cx2600, cx2620, rx1600, rx1620, rx2600,
rx2600hptc, rx2620, rx2660, rx2800, rx3600, rx4610, rx4640, rx5670,
rx6600, rx7420, rx7620, rx7640, rx8420, rx8620, rx8640, rx9610,
sx1000, sx2000

要查看有关您的机器的所有信息,请键入

# model
ia64 hp server rx2600
# /usr/contrib/bin/machinfo

HP-UX 版本

并非所有架构(PA = PA-RISC,IPF = 安腾处理器系列)都支持所有版本的 HP-UX,这里有一个简短的列表

HP-UX version  Kernel  Architecture End-of-factory support
-------------  ------  ------------ ----------------------------------
10.20          32 bit  PA           30-Jun-2003
11.00          32/64   PA           31-Dec-2006
11.11  11i v1  32/64   PA           31-Dec-2015
11.22  11i v2     64        IPF     30-Apr-2004
11.23  11i v2     64   PA & IPF     31-Dec-2015
11.31  11i v3     64   PA & IPF     31-Dec-2020 (PA) 31-Dec-2025 (IPF)

有关硬件/操作系统支持和预期寿命的完整列表,请参阅 https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf

在 HP-UX 上构建动态扩展

HP-UX 支持动态可加载库(共享库)。共享库以后缀 .sl 结尾。在安腾系统上,它们以后缀 .so 结尾。

默认情况下,在使用特定 PA-RISC 版本的平台上创建的共享库不能在使用较早 PA-RISC 版本的平台上使用。但是,可以使用相同的 +DAportable 编译器标志(以及上面提到的相同的 PA-RISC 1.0 警告)来启用这种向后兼容性。

在安腾平台上创建的共享库不能在 PA-RISC 平台上加载。在 PA-RISC 平台上创建的共享库只能在尝试加载 PA-RISC 库的 PA-RISC 可执行文件上加载。PA-RISC 共享库不能加载到安腾可执行文件中,反之亦然。

要创建共享库,必须执行以下步骤

1. Compile source modules with +z or +Z flag to create a .o module
   which contains Position-Independent Code (PIC).  The linker will
   tell you in the next step if +Z was needed.
   (For gcc, the appropriate flag is -fpic or -fPIC.)

2. Link the shared library using the -b flag.  If the code calls
   any functions in other system libraries (e.g., libm), it must
   be included on this line.

(请注意,这些步骤通常由扩展的 Makefile 自动处理)。

如果在创建共享库时未列出这些依赖库,则在加载库时运行时将出现致命的“未解析符号”错误。

您可以创建一个引用另一个库的共享库,该库可以是归档库或共享库。如果这个第二个库是共享库,则称为“依赖库”。依赖库的名称记录在主共享库中,但不会链接到共享库中。相反,当加载主共享库时,它会被加载。如果您在一个系统上构建扩展并将其移动到另一个系统(库可能不在与第一个系统相同的位置),这可能会导致问题。

如果引用的库是归档库,则将其视为 .o 模块的简单集合(所有模块都必须包含 PIC)。然后将这些模块链接到共享库中。

请注意,创建包含已链接到 Perl 的依赖库的库是可以的。

一些扩展,如 DB_File 和 Compress::Zlib 使用/需要预构建库才能使 Perl 扩展/模块工作。如果使用默认配置构建这些库,则在加载阶段可能会遇到“无效加载器修复”之类的错误。惠普公司意识到这个问题。在 HP-UX cxx-dev 论坛中搜索有关该主题的讨论。简而言之,所有内容(所有库,所有内容)都必须使用 +z+Z 编译为 PIC(位置无关代码)。(对于 gcc,应为 -fpic-fPIC)。在 HP-UX 11.00 或更高版本中,链接器错误消息应告知违规对象文件的文件名。

一种更通用的方法是手动干预,例如 DB_File 模块的示例,它需要 SleepyCat 的 libdb.sl

# cd .../db-3.2.9/build_unix
# vi Makefile
... add +Z to all cflags to create shared objects
CFLAGS=         -c $(CPPFLAGS) +Z -Ae +O2 +Onolimit \
                -I/usr/local/include -I/usr/include/X11R6
CXXFLAGS=       -c $(CPPFLAGS) +Z -Ae +O2 +Onolimit \
                -I/usr/local/include -I/usr/include/X11R6

# make clean
# make
# mkdir tmp
# cd tmp
# ar x ../libdb.a
# ld -b -o libdb-3.2.sl *.o
# mv libdb-3.2.sl /usr/local/lib
# rm *.o
# cd /usr/local/lib
# rm -f libdb.sl
# ln -s libdb-3.2.sl libdb.sl

# cd .../DB_File-1.76
# make distclean
# perl Makefile.PL
# make
# make test
# make install

从 db-4.2.x 开始,不再需要手动执行此操作。Sleepycat 已更改配置过程以在 HP-UX 上自动添加 +z。

# cd .../db-4.2.25/build_unix
# env CFLAGS=+DD64 LDFLAGS=+DD64 ../dist/configure

应该可以为 HP-UX 11.00 和 11i 生成 64 位共享库。

不再可以链接 PA-RISC 1.0 共享库(即使命令行标志仍然存在)。

PA-RISC 和 Itanium 对象文件不可互换。虽然您可能可以使用 ar 在 Itanium 系统上创建 PA-RISC 对象文件的归档库,但您不能使用 Itanium 链接编辑器对其进行链接。

HP ANSI C 编译器

使用此编译器构建 Perl 时,您应确保在 config.sh 文件中的 cpprun 和 cppstdin 变量中添加标志 -Aa(但请参见以下有关 64 位 Perl 的部分)。如果您使用的是 Perl 发行版的最新版本,则会自动设置这些标志。

即使 HP-UX 10.20 和 11.00 不再由 HP 积极维护,但 HP ANSI C 编译器的更新仍然会不时提供,建议查看是否有适用的更新。在撰写本文时,应应用的 11.00 的最新可用补丁为 PHSS_35098、PHSS_35175、PHSS_35100、PHSS_33036 和 PHSS_33902)。如果您有 SUM 帐户,可以使用它来搜索更新/补丁。输入“ANSI”作为关键字。

GNU C 编译器

当您准备使用 GNU C 编译器 (gcc) 且尚未拥有 gcc 时,您可以自行构建(如果您自虐倾向足够严重的话)源代码(例如,从 http://gcc.gnu.org/mirrors.html 获取)或从 HP 移植中心 http://hpux.connect.org.uk/hppd/cgi-bin/search?term=gcc&Search=Search 或 DSPP(您需要成为会员)http://h21007.www2.hp.com/portal/site/dspp/menuitem.863c3e4cbcdc3f3515b49c108973a801?ciid=2a08725cc2f02110725cc2f02110275d6e10RCRD&jumpid=reg_r1002_usen_c-001_title_r0001 获取预构建的二进制文件(浏览列表,因为通常有多个版本的相同软件包可用)。

大多数提到的发行版都是存储库。H.Merijn Brand 已在 http://mirrors.develooper.com/hpux/ 和/或 http://www.cmve.net/~merijn/ 上为 HP-UX 10.20(仅 32 位)、HP-UX 11.00、HP-UX 11.11(HP-UX 11i v1)和 HP-UX 11.23(HP-UX 11i v2 PA-RISC)提供了预构建的 gcc 二进制文件,32 位和 64 位版本均有。对于 HP-UX 11.23 IPF 和 HP-UX 11.31 IPF,存储库也可用。IPF 版本不需要两个版本的 GNU gcc。

在 PA-RISC 上,您需要不同的编译器来处理 32 位应用程序和 64 位应用程序。在 PA-RISC 上,32 位对象和 64 位对象不会混合。句号。HP C-ANSI-C 或 GNU gcc 的行为没有不同。因此,如果您要求您的 perl 二进制文件使用 64 位库(如 Oracle-64 位),则必须构建一个 64 位 perl。

仅当您拥有 HP C-ANSI C 编译器或已经工作的 gcc 64 位二进制文件时,才可以在 PA-RISC 上从源代码构建支持 64 位的 gcc。使用 HP 的本机编译器可以实现 perl 的最佳性能。

在 HP-UX 上使用 Perl 处理大文件

从 HP-UX 版本 10.20 开始,可以创建和操作大于 2GB(2^31 字节)的文件。有三种不同的方法可以做到这一点。在这些方法中,最适合 Perl 的方法是使用 -Duselargefiles 标志编译 Configure。这会导致 Perl 使用结构和函数进行编译,其中这些结构和函数的宽度为 64 位,而不是 32 位。(请注意,这仅适用于 HP 的 ANSI C 编译器。如果您想使用 gcc 编译 Perl,则必须获取支持 64 位操作的编译器版本。请参阅上文以了解在哪里可以找到它。)

这种方法有一些缺点。一是任何调用任何文件操作 C 函数的扩展都需要重新编译(只需按照通常的“perl Makefile.PL;make;make test;make install”程序进行操作)。

需要重新编译的函数列表:creat、fgetpos、fopen、freopen、fsetpos、fstat、fstatvfs、fstatvfsdev、ftruncate、ftw、lockf、lseek、lstat、mmap、nftw、open、prealloc、stat、statvfs、statvfsdev、tmpfile、truncate、getrlimit、setrlimit

另一个缺点仅适用于 5.6.0 之前的 Perl 版本。此缺点是 seek 和 tell 函数(内置版本和 POSIX 模块版本)将无法正确执行。

强烈建议您在运行 Configure 时使用此标志。如果您不这样做,但在 Configure 询问您有关大文件的问题时才回答,您可能会得到无法编译或无法按预期运行的配置。

HP-UX 上的线程 Perl

可以在任何低于 10.30 的 HP-UX 版本上编译线程 Perl 版本,但强烈建议您至少在 HP-UX 11.00 上运行。

要使用线程编译 Perl,请将 -Dusethreads 添加到 Configure 的参数中。验证是否已将 -D_POSIX_C_SOURCE=199506L 编译器标志自动添加到标志列表中。还要确保在 Perl 链接库的列表中 -lpthread 在 -lc 之前列出。Configure 期间为 HP-UX 提供的提示将非常努力地为您实现这一点。

10.30 之前的 HP-UX 版本需要单独安装 POSIX 线程库包。两个示例是 HP DCE 包,可在“HP-UX 硬件扩展 3.0、安装和核心操作系统,10.20 版,1999 年 4 月 (B3920-13941)”中获得,或 H.Merijn 网站上提供的免费 PTH 包 (http://mirrors.develooper.com/hpux/)。PTH 的使用在 perl-5.12 及更高版本中不受支持,并且在 5.11.x 中相当容易出错。

如果您要使用 HP DCE 包,则用于线程的库是 /usr/lib/libcma.sl,但随着时间的推移,该库已多次更新。Perl 将使用第一个版本构建,但它不会通过测试套件。较旧的 Oracle 版本可能是不更新该库的充分理由,否则请在以下补丁之一中找到较新版本:PHSS_19739、PHSS_20608 或 PHSS_23672

重新格式化的输出

d3:/usr/lib 106 > what libcma-*.1
libcma-00000.1:
   HP DCE/9000 1.5               Module: libcma.sl (Export)
                                 Date: Apr 29 1996 22:11:24
libcma-19739.1:
   HP DCE/9000 1.5 PHSS_19739-40 Module: libcma.sl (Export)
                                 Date: Sep  4 1999 01:59:07
libcma-20608.1:
   HP DCE/9000 1.5 PHSS_20608    Module: libcma.1 (Export)
                                 Date: Dec  8 1999 18:41:23
libcma-23672.1:
   HP DCE/9000 1.5 PHSS_23672    Module: libcma.1 (Export)
                                 Date: Apr  9 2001 10:01:06
d3:/usr/lib 107 >

如果您选择 PTH 包,请使用 swinstall 在默认位置 (/opt/pth) 中安装 pth,然后从 /usr/lib 中创建指向库的符号链接

# cd /usr/lib
# ln -s /opt/pth/lib/libpth* .

要构建 perl 以支持 Oracle,需要将其与 libcl 和 libpthread 链接。因此,即使您的 perl 是非线程构建,也可能需要这些库。请参阅下面的“HP-UX 上的 Oracle”。

64 位 HP-UX 上的 Perl

从 HP-UX 11.00 开始,在 HP-UX 下编译的程序可以使用 LP64 编程环境(LP64 表示长整型和指针的宽度为 64 位),其中标量变量可以精确保存大于 2^32 的数字。自 5.8.1 版开始,Perl 在所有 HP-UX 11.xx 上的 64 位模式下都表现得一致且可靠。

截至本文档发布日期,Perl 在 HP-UX 11.00 及更高版本上完全符合 64 位,适用于 cc 和 gcc 构建。如果您准备使用 GNU gcc 构建 64 位 perl,请仔细阅读 gcc 部分。

如果用户需要在 LP64 环境中编译 Perl,请在 Configure 中使用 -Duse64bitall 标志。这将强制 Perl 在纯 LP64 环境中编译(对于 HP C-ANSI-C 使用 +DD64 标志,对于 PA-RISC 上的 GNU gcc 64 位不使用其他选项,对于 Itanium 上的 GNU gcc 使用 -mlp64)。如果您想使用 gcc 编译 Perl,您必须获得支持 64 位操作的编译器版本。)

您还可以使用 -Duse64bitint 标志在 Configure 中。尽管使用此标志编译 Perl 与使用 -Duse64bitall 标志之间存在一些细微差别,但从 Perl 用户的角度来看,这些差别并不明显。当在 pa-risc 架构上使用 64 位 gcc 配置 -Duse64bitint 时,-Duse64bitint 会被静默提升为 -Duse64bitall。

在这两种情况下,强烈建议您在运行 Configure 时使用这些标志。如果您不这样做,但在 Configure 询问您有关 64 位数字的问题时才回答,您可能会得到无法编译或无法按预期运行的配置。

HP-UX 上的 Oracle

使用 perl 通过 DBI 和 DBD::Oracle 连接到 Oracle 数据库给许多人带来了很多麻烦。有关更多信息,请阅读 DBD::Oracle 中的 README.hpux。在这里提及它的原因是 Oracle 需要使用 libcl 和 libpthread 构建的 perl,即使在不使用线程构建 perl 时也是如此。使用所有默认值构建 perl,但仍然可以在以后启用构建 DBD::Oracle,可以使用

Configure -A prepend:libswanted='cl pthread ' ...

不要忘记尾随引号前的空格。

另外请注意,这(尚未)适用于所有配置,已知在 64 位版本的 GCC 中会失败。

HP-UX 上的 GDBM 和线程

如果您尝试在 11.X 系统上使用(POSIX)线程编译 Perl,并且还链接了 GDBM 库,那么 Perl 在启动时会立即转储核心。此时唯一的解决方法是在 11.X 下重新链接 GDBM 库,然后将其重新链接到 Perl 中。

错误可能显示类似内容

Pthread 内部错误:消息:__libc_reinit() 失败,文件:../pthreads/pthread.c,行:1096 返回指针为 0xc082bf33 sh:5345 退出(转储核心)

并且 Configure 将放弃。

HP-UX 上的 NFS 文件系统和 utime(2)

如果您在远程挂载的 NFS 文件系统上编译 Perl,测试 io/fs.t 可能会在测试 #18 中失败。这似乎是 HP-UX 中的一个缺陷,目前没有可用的修复程序。

用于编译 Perl 的 HP-UX 内核参数 (maxdsiz)

默认情况下,HP-UX 配置的最大数据段大小为 64MB。这太小,无法使用最大优化级别正确编译 Perl。您可以通过使用 SAM 来增加 maxdsiz 内核参数的大小。

使用 SAM 的 GUI 版本时,单击内核配置图标,然后单击可配置参数图标。向下滚动并选择 maxdsiz 行。从操作菜单中,选择修改可配置参数项。将新公式插入到公式/值框中。然后按照说明重建内核并重新启动系统。

通常,256MB(或“256*1024*1024”)的值足以让 Perl 以最大优化进行编译。

nss_delete 内核转储来自 op/pwent 或 op/grent

您可能会从 op/pwent 或 op/grent 测试中获得总线错误内核转储。如果使用 -g 编译,您将看到类似于以下内容的堆栈跟踪

#0  0xc004216c in  () from /usr/lib/libc.2
#1  0xc00d7550 in __nss_src_state_destr () from /usr/lib/libc.2
#2  0xc00d7768 in __nss_src_state_destr () from /usr/lib/libc.2
#3  0xc00d78a8 in nss_delete () from /usr/lib/libc.2
#4  0xc01126d8 in endpwent () from /usr/lib/libc.2
#5  0xd1950 in Perl_pp_epwent () from ./perl
#6  0x94d3c in Perl_runops_standard () from ./perl
#7  0x23728 in S_run_body () from ./perl
#8  0x23428 in perl_run () from ./perl
#9  0x2005c in main () from ./perl

这里的关键是 nss_delete 调用。针对此缺陷的一个解决方法似乎是在文件 /etc/nsswitch.conf 中至少添加以下行

group: files
passwd: files

您是否使用 NIS 并不重要。令人惊讶的是,同样的缺陷也影响了 Solaris。

错误:粘贴“)”和“l”不会提供有效的预处理标记

HP-UX 11.00 中似乎有一个损坏的系统头文件,导致使用 GNU gcc-4.x 在 32 位模式下构建 perl 时发生此错误。HP-UX 11.11 的相同文件(即使该文件较旧)也不会显示此故障,并且具有正确的定义,因此最佳修复方法是修补头文件以匹配

--- /usr/include/inttypes.h  2001-04-20 18:42:14 +0200
+++ /usr/include/inttypes.h  2000-11-14 09:00:00 +0200
@@ -72,7 +72,7 @@
 #define UINT32_C(__c)                   __CONCAT_U__(__c)
 #else /* __LP64 */
 #define INT32_C(__c)                    __CONCAT__(__c,l)
-#define UINT32_C(__c)                   __CONCAT__(__CONCAT_U__(__c),l)
+#define UINT32_C(__c)                   __CONCAT__(__c,ul)
 #endif /* __LP64 */

 #define INT64_C(__c)                    __CONCAT_L__(__c,l)

使用不同的存储类说明符重新声明“sendpath”

以下编译警告可能会在早于 11.31 的 HP-UX 版本中发生,但无害

cc: "/usr/include/sys/socket.h", line 535: warning 562:
   Redeclaration of "sendfile" with a different storage class
   specifier: "sendfile" will have internal linkage.
cc: "/usr/include/sys/socket.h", line 536: warning 562:
   Redeclaration of "sendpath" with a different storage class
   specifier: "sendpath" will have internal linkage.

它们似乎是由损坏的系统头文件引起的,其他开源项目也看到了它们。以下 HP-UX 补丁应消除这些警告

CR JAGae12001: PHNE_27063
Warning 562 on sys/socket.h due to redeclaration of prototypes

CR JAGae16787:
Warning 562 from socket.h sendpath/sendfile -D_FILEFFSET_BITS=64

CR JAGae73470 (11.23)
ER: Compiling socket.h with cc -D_FILEFFSET_BITS=64 warning 267/562

其他

据报道,HP-UX 11 Y2K 补丁“Y2K-1100 B.11.00.B0125 HP-UX Core OS Year 2000 Patch Bundle”破坏了 io/fs 测试 #18,该测试测试 utime() 是否可以更改时间戳。Y2K 补丁似乎破坏了 utime(),因此在 NFS 上时间戳不会更改(在本地文件系统上 utime() 仍然有效)。这现在可能已在您的系统中得到修复。

作者

H.Merijn Brand <[email protected]> Jeff Okamoto <[email protected]>

Marc Sabatella 在共享库方面提供了很多帮助。