目錄

名稱

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(Itanium 處理器系列)。它們是使用 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,HP 不再販售任何配備這些 CPU 的系統。

HP 的 HP9000 Unix 系統在 HP 自家的 Precision Architecture (PA-RISC) 晶片上執行。HP-UX 過去在 Motorola MC68000 系列晶片上執行,但配備此晶片的任何機器都已相當過時,本文不會嘗試說明在 Motorola 晶片組上編譯 Perl 的問題。儘管 PA-RISC 硬體不再販售,但仍可以在野外找到許多配備這些 CPU 的機器。

HP 9000 系統的最後訂購日期為 2008 年 12 月 31 日。

HP 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 檔案中列出 OS 建置時的所有型號清單。第一欄對應於「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 的原始版本,HP 不再販售任何配備此晶片的系統。

下列系統包含 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 收購 Compaq 之前,一些系統被重新命名。包含說明的連結已失效,因此以下是簡短摘要

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 系統時,產生的可執行檔不會執行。

Itanium 處理器家族 (IPF) 與 HP-UX

HP-UX 也可在較新的 Itanium 處理器上執行。這需要使用 HP-UX 版本 11.23 (11i v2) 或 11.31 (11i v3),且除了以下部分和稍後部分詳述的幾個差異外,Perl 應該可以順利編譯。

儘管 PA-RISC 二進位檔可以在 Itanium 系統上執行,但您不應嘗試在 Itanium 系統上使用 PA-RISC 版本的 Perl。這是因為在 Itanium 系統上建立的共用函式庫無法在執行 PA-RISC 可執行檔時載入。

HP Itanium 2 系統通常稱為型號說明「HP Integrity」。

Itanium、Itanium 2 與 Madison 6

HP 也出貨搭載 128 位元 Itanium 處理器的伺服器。cx26x0 據說有 Madison 6。截至本文最後更新日期,下列系統包含 Itanium 或 Itanium 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 = Itanium 處理器家族) 都支援所有版本的 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 結尾。在 Itanium 系統上,它們以字尾 .so 結尾。

在使用特定 PA-RISC 版本的平台上建立的共用函式庫,預設無法在使用較早 PA-RISC 版本的平台上使用。不過,可以使用相同的 +DAportable 編譯器旗標 (與上述相同的 PA-RISC 1.0 警告) 來啟用這種向後相容性。

在 Itanium 平台上建立的共用函式庫無法在 PA-RISC 平台上載入。在 PA-RISC 平台上建立的共用函式庫只能在 PA-RISC 可執行檔嘗試載入 PA-RISC 函式庫時載入到 Itanium 平台上。無法將 PA-RISC 共用函式庫載入 Itanium 可執行檔,反之亦然。

若要建立共用函式庫,必須執行下列步驟

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 已知悉此問題。請搜尋 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 時,您應確保已將旗標 -Aa 加入 config.sh 檔案中的 cpprun 和 cppstdin 變數(但請參閱下方 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)取得,或從 http://hpux.connect.org.uk/hppd/cgi-bin/search?term=gcc&Search=Search 的 HP 移植中心或 http://h21007.www2.hp.com/portal/site/dspp/menuitem.863c3e4cbcdc3f3515b49c108973a801?ciid=2a08725cc2f02110725cc2f02110275d6e10RCRD&jumpid=reg_r1002_usen_c-001_title_r0001 的 DSPP(您需要成為會員)取得預先建置的二進位檔(瀏覽清單,因為通常會有同一個套件的許多版本)。

大部分提到的發行版都是儲存庫。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-64bit,您必須建置 64 位元 perl。

僅當您有 HP C-ANSI C 編譯器或已運作的 64 位元 gcc 二進位檔時,才可以在 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 編譯器標記是否自動新增到標記清單中。此外,請確保 -lpthread 在與 Perl 連結的函式庫清單中列在 -lc 之前。Configure 在 HP-UX 期間提供的提示將非常努力地為您做到這一點。

10.30 之前的 HP-UX 版本需要另外安裝 POSIX 執行緒函式庫套件。兩個範例是 HP DCE 套件,可在「HP-UX 硬體擴充套件 3.0、安裝和核心作業系統、1999 年 4 月第 10.20 版(B3920-13941)」中取得,或 H.Merijn 網站(http://mirrors.develooper.com/hpux/)中可取得的免費 PTH 套件。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* .

為了建置支援 Oracle 的 perl,它需要與 libcl 和 libpthread 連結。因此,即使您的 perl 是非執行緒建置,也可能需要這些函式庫。請參閱下方的「HP-UX 上的 Oracle」。

HP-UX 上的 64 位元 Perl

從 HP-UX 11.00 開始,在 HP-UX 下編譯的程式可以利用 LP64 程式設計環境(LP64 表示 Longs 和 Pointers 為 64 位元寬),其中標量變數將能夠以完全精度儲存大於 2^32 的數字。Perl 已被證明在所有 HP-UX 11.xx 上的 64 位元模式中自 5.8.1 以來始終如一且可靠。

截至本文檔的日期,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 位元運算的編譯器版本。)

您也可以對 Configure 使用 -Duse64bitint 標記。儘管使用此標記編譯 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 以最大最佳化編譯。

從 op/pwent 或 op/grent 中刪除 nss_delete 核心傾印

您可能會從 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 中似乎有一個損毀的系統標頭檔,會導致 perl 在 32 位元模式下使用 GNU gcc-4.x 編譯時中斷,並導致此錯誤。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 <h.m.brand@xs4all.nl> Jeff Okamoto <okamoto@corp.hp.com>

Marc Sabatella 提供許多關於共用函式庫的協助。