perlaix - IBM AIX (UNIX) 系統上的 Perl 版本 5
本文檔說明 IBM 的 UNIX 作業系統 AIX 的各種功能,這些功能會影響 Perl 版本 5 (以下簡稱 Perl) 的編譯和/或執行方式。
如需瞭解較舊版本的 AIX 上的編譯器資訊,請參閱 "在較舊的 AIX 版本(最高至 4.3.3)上編譯 Perl 5"。
編譯 Perl 時,您必須使用 ANSI C 編譯器。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 無法正確編譯,因為有最佳化錯誤。您可以透過將 -qipa 加入最佳化旗標 (-Doptimize='-O -qipa') 來解決此問題。解決此問題的 APAR IZ35785 PTF 可從 IBM 取得 (2009 年 4 月的 XL C/C++ Enterprise Edition for AIX, V9.0 PTF)。
如果您選擇 XL C/C++ V11,則需要安裝 2010 年 4 月 PTF (或更新版本),否則您將無法取得可運作的 Perl 版本。
Perl 可以使用 IBM 的 ANSI C 編譯器或 gcc 編譯。建議使用前者,因為它不僅可以毫無困難地編譯 Perl,還可以利用稍後列出的功能,而這些功能需要使用 IBM 編譯器專用的命令列旗標。
如果您決定使用 gcc,請確定您的安裝是最新且完整的,並務必閱讀 Perl 安裝檔案,以取得更多 gcc 專屬的詳細資訊。請向開發團隊報告您必須克服的任何難題。
如果系統已安裝 AIX Toolbox 版本的 lib gdbm < 1.8.3-5,Perl 將無法運作。此函式庫包含標頭檔 /opt/freeware/include/gdbm/dbm.h|ndbm.h,與 AIX 系統版本有衝突。如果偵測到這兩個標頭檔其中一個,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 系統 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)作為一些 AIX 系統指令碼。如果您將 /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,您需要一個影響 (n)dbm_XXX 函式的 libc.a 錯誤的 APAR。此問題的 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 位元,但它並非會提供 116 位元尾數的 IEEE 128 位元(「四倍精度」)(它也未在硬體中實作),而是一個稱為「雙雙」的特殊軟體實作,提供 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 安裝平行的目錄中。
使用下列選項,您將取得一個 Perl 版本,它通過 32 位元模式中的所有 make 測試。
rm config.sh
./Configure \
-d \
-Dcc=cc_r \
-Duseshrplib \
-Dprefix=/usr/opt/perl5_32
-Dprefix 選項會將 Perl 安裝在與 IBM AIX 系統 Perl 安裝平行的目錄中。
使用下列選項,您將取得一個執行緒 Perl 版本,它通過 64 位元模式中的所有 make 測試。
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
使用下列選項,您將取得一個 Perl 版本,它通過 64 位元模式中的所有 make 測試。
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 測試失敗。APAR IV16514 提供了此問題的修正。一個快速測試,假設目前是東部時間的夏令時間,可以執行 TZ=EST5 date +%Z
來查看是否需要。這通常會回傳 EST
,但如果您有問題,則不會回傳任何內容。
由於 AIX 4.3.3 已於 2003 年 12 月 31 日結束服務,因此提供此資訊。Perl 5.8.9 之前的 Perl 版本可以在 AIX 上編譯至 4.3.3,並使用下列設定 (您的里程數可能會有所不同)
編譯 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 for 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 安裝檔案,以取得更多 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 或其他作業系統等級也可能發生同樣的情況。附帶一提,Perl 無法在未安裝 bos.adt.syscalls 和 bos.adt.libm 的情況下建置
# 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 更符合其他應用程式,例如使用 AIX 原生介面的 Apache/mod_perl。此變更也讓 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
在使用 xlC 的 AIX 4.2 上,我們繼續
# 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 ]
遵循訊息 ... 然後就完成了。
如果您喜歡更類似於網路的方式,一個好的起點可以是 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 <tammer@tammer.net>