內容

名稱

perlsolaris - Solaris 系統上的 Perl 版本 5

說明

此文件說明 Sun 的 Solaris 作業系統中會影響 Perl 第 5 版(以下簡稱 perl)編譯和/或執行的各種功能。雖然可能已過時,但本文也討論了與較舊的 SunOS 4.x 相關的一些問題。

大部分情況下,一切應可正常運作。

從 Solaris 8 開始,作業系統會隨附 perl5.00503(或更高版本),因此您可能甚至不需要建置較新版本的 perl。Sun 提供的版本會安裝在 /usr/perl5 中,其中 /usr/bin/perl 指向 /usr/perl5/bin/perl。除非您真的知道自己在做什麼,否則請勿變更該安裝。如果您移除作業系統隨附的 perl,系統中的某些部分將無法運作。如果您想安裝較新版本的 perl,請將其安裝在與 /usr/perl5 不同的前置詞下。常用的前置詞為 /usr/local 和 /opt/perl。

您可以透過變更連結 /usr/bin/perl,將您的 perl 版本放入所有使用者的 PATH 中。這可能是可以的,因為 Solaris 隨附的大部分 perl 腳本都使用明確路徑。(有一些例外,例如 /usr/bin/rpm2cpio/etc/rcm/scripts/README,但這些例外也夠一般化,因此 perl 的實際版本可能不太重要。)

Solaris 隨附一系列 Solaris 特定的模組。如果您選擇安裝自己的 perl 版本,您會發現這些模組中的許多原始碼都可以在 CPAN 中的 Sun::Solaris:: 名稱空間中取得。

Solaris 可能包含兩個版本的 perl,例如 Solaris 9 包含 5.005_03 和 5.6.1。這是為了在 Solaris 版本之間提供穩定性,以防後續的 perl 版本與前一個 Solaris 版本中包含的版本不相容。預設的 perl 版本將永遠是最新的版本,而且通常舊版本只會保留一個 Solaris 版本。另請注意,預設的 perl 將不會設定為在舊版本中搜尋模組,這也是基於相容性/穩定性考量。因此,如果您升級 Solaris,您必須重新建置/重新安裝您為前一個 Solaris 版本安裝的任何其他 CPAN 模組。請參閱 CPAN 手冊頁面的「autobundle」部分,以取得快速執行此動作的方法。

作為過渡措施,您可以變更腳本的 #! 行,以特別指派舊的 perl 版本,例如在 Solaris 9 上使用 #!/usr/perl5/5.00503/bin/perl 來使用 Solaris 8 的預設 perl 版本,或者如果您有大量的腳本,讓舊版本的 perl 成為系統上的預設版本可能會更方便。您可以透過變更 /usr/perl5 下的適當符號連結來執行此動作,如下所示(Solaris 9 的範例)

# cd /usr/perl5
# rm bin man pod
# ln -s ./5.00503/bin
# ln -s ./5.00503/man
# ln -s ./5.00503/lib/pod
# rm /usr/bin/perl
# ln -s ../perl5/5.00503/bin/perl /usr/bin/perl

在這兩種情況下,這都應被視為暫時措施 - 您應盡快升級到較新的 perl 版本。

另請注意,perl 命令列公用程式(例如 perldoc)和您安裝的模組所新增的任何公用程式將會位於 /usr/perl5/bin,因此應該將該目錄新增至您的 PATH。

Solaris 版本號碼。

為了與一般用法保持一致,perl 的 Configure 腳本會對 uname 所回報的作業系統名稱和版本號碼執行一些小操作。以下是部分轉換表

         Sun:                      perl's Configure:
uname    uname -r   Name           osname     osvers
SunOS    4.1.3     Solaris 1.1     sunos      4.1.3
SunOS    5.6       Solaris 2.6     solaris    2.6
SunOS    5.8       Solaris 8       solaris    2.8
SunOS    5.9       Solaris 9       solaris    2.9
SunOS    5.10      Solaris 10      solaris    2.10

完整的表格可以在 Sun Managers' FAQ ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq 的「9.1) Which Sun models run which versions of SunOS?」找到。

資源

有許多 Solaris 資訊來源。以下是 perl 的幾個重要來源

Solaris FAQ

Solaris FAQ 可在 http://www.science.uva.nl/pub/solaris/solaris2.html 取得。

Sun Managers' FAQ 可在 ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq 取得。

預編譯二進位檔

預編譯二進位檔、許多網站的連結,以及更多內容可在 http://www.sunfreeware.com/http://www.blastwave.org/ 取得。

Solaris 文件

所有 Solaris 文件都可以在 http://docs.sun.com/ 線上取得。

設定

Solaris 上的檔案解壓縮問題。

務必使用在 Solaris(而非 SunOS 4.x)下編譯的 tar 程式來解壓縮 perl-5.x.x.tar.gz 檔案。請勿在 Solaris 上使用為 SunOS4 編譯的 GNU tar。(為 Solaris 編譯的 GNU tar 應該沒問題。)當您在 Solaris 上執行 SunOS4 二進位檔時,執行時期系統會神奇地變更符合 m#lib/locale# 的路徑名稱,因此當 tar 嘗試建立 lib/locale.pm 時,建立的會是 lib/oldlocale.pm 檔案。如果您太晚看到這項建議並仍然使用了 SunOS4 編譯的 tar,您必須找到錯誤重新命名的檔案,並將其移回 lib/locale.pm。

您必須使用 ANSI C 編譯器來建置 perl。Perl 可以使用 Sun 的附加元件 C 編譯器或 gcc 編譯。隨 SunOS4 附帶的 C 編譯器無法使用。

在您的 PATH 中包含 /usr/ccs/bin/。

建立 perl 所需的幾個工具位於 /usr/ccs/bin/ 中:ar、as、ld 和 make。請確定 /usr/ccs/bin/ 在您的 PATH 中。

在所有已發布的 Solaris 版本(8、9 和 10)中,您需要確定已安裝以下套件(此資訊摘錄自 Solaris FAQ)

對於工具(sccs、lex、yacc、make、nm、truss、ld、as):SUNWbtool、SUNWsprot、SUNWtoo

對於函式庫和標頭:SUNWhea、SUNWarc、SUNWlibm、SUNWlibms、SUNWdfbh、SUNWcg6h、SUNWxwinc

此外,在 Solaris 8 和 9 中,您也需要

對於 64 位元開發:SUNWarcx、SUNWbtoox、SUNWdplx、SUNWscpux、SUNWsprox、SUNWtoox、SUNWlmsx、SUNWlmx、SUNWlibCx

僅在 Solaris 8 中,您也需要

對於函式庫和標頭:SUNWolinc

如果您不確定哪個套件包含您缺少的檔案,請嘗試尋找具有該檔案的安裝程式。然後執行

$ grep /my/missing/file /var/sadm/install/contents

這將顯示類似下列的列

/usr/include/sys/errno.h f none 0644 root bin 7471 37605 956241356 SUNWhea

所列出的最後一項(此範例中為 SUNWhea)是您需要的套件。

避免 /usr/ucb/cc。

您不需要在您的 PATH 中包含 /usr/ucb/ 來建立 perl。如果您仍想在您的 PATH 中包含 /usr/ucb/,請確定 /usr/ucb/ 不在 PATH 中,而是在包含正確 C 編譯器的目錄之前。

Sun 的 C 編譯器

如果您使用 Sun 的 C 編譯器,請確定正確的目錄(通常為 /opt/SUNWspro/bin/)在您的 PATH 中(在 /usr/ucb/ 之前)。

GCC

如果您使用 gcc,請確定您的安裝程式是最新且完整的。自 5.6.0 以來的 perl 版本可在 Solaris >= 2.6 上與 gcc > 2.8.1 順利建立。

您必須使用以下方式設定 perl:

$ sh Configure -Dcc=gcc

如果您未執行此步驟,您可能會遇到奇怪的建立錯誤。

如果您已更新 Solaris 版本,您可能也必須更新您的 gcc。例如,如果您正在執行 Solaris 2.6,且您的 gcc 安裝在 /usr/local 下,請檢查 /usr/local/lib/gcc-lib,並確定您有適當的目錄,sparc-sun-solaris2.6/ 或 i386-pc-solaris2.6/。如果 gcc 的目錄是針對與您正在執行的 Solaris 不同版本的 Solaris,那麼您將需要為您的新 Solaris 版本重新建置 gcc。

您可以從 http://www.sunfreeware.com/http://www.blastwave.org/ 取得 gcc 的預編譯版本。請務必選取適用於您的 Solaris 版本的套件。

如果您希望使用 gcc 建置外掛模組以搭配 Solaris 附帶的 perl 使用,您應該使用 Solaris::PerlGcc 模組,該模組可從 CPAN 取得。Solaris 附帶的 perl 是使用 Sun 編譯器設定和建置的,因此儲存在 Config.pm 中的編譯器設定資訊僅與 Sun 編譯器相關。Solaris:PerlGcc 模組包含一個替換 Config.pm,該模組適用於 gcc - 請參閱該模組以取得詳細資訊。

GNU as 和 GNU ld

下列資訊適用於 gcc 版本 2。歡迎自願者協助更新為適用於 gcc 版本 3 的適當資訊。

Solaris 提供的 as 和 ld 版本適用於建置 perl。通常不需要安裝 GNU 版本來編譯 perl。

如果您決定忽略此建議並使用 GNU 版本,那麼請務必確認它們是相對較新的版本。2.7 以上的版本顯然夠新。較舊的版本可能會發生動態載入問題。

如果您希望使用 GNU ld,那麼您需要傳遞 -Wl,-E 旗標給它。hints/solaris_2.sh 檔案會嘗試透過設定下列 Configure 變數自動執行此動作

ccdlflags="$ccdlflags -Wl,-E"
lddlflags="$lddlflags -Wl,-E -G"

然而,多年來,gcc、GNU ld 和 Solaris ld 的變更使得自動偵測最終呼叫的 ld 變得困難。您可能必須手動編輯 config.sh 並自行加入 -Wl,-E 旗標,或以互動方式執行 Configure 並在適當的提示時加入旗標。

如果您的 gcc 設定為使用 GNU as 和 ld,但您想要使用 Solaris 的 as 和 ld 來建置 perl,那麼您需要將 -B/usr/ccs/bin/ 加入 gcc 命令列。一個方便的方法是使用

$ sh Configure -Dcc='gcc -B/usr/ccs/bin/'

請注意,尾端的斜線是必要的。這將導致在執行 Configure 時產生一些無害的警告

gcc: file path prefix `/usr/ccs/bin/' never used

這些訊息可以安全地忽略。(請注意,對於 SunOS4 系統,您必須使用 -B/bin/。)

或者,您可以使用 GCC_EXEC_PREFIX 環境變數,以確保使用 Sun 的 as 和 ld。請參閱您的 gcc 文件,以進一步瞭解 -B 選項和 GCC_EXEC_PREFIX 變數。

Sun 和 GNU make

/usr/ccs/bin 底下的 make 適用於建置 perl。如果您有 Sun C 編譯器,您也會有 make 的平行版本 (dmake)。這適用於建置 perl,但有時會在執行「make test」時造成問題,原因是不同測試架構檔案之間的相依性未指定。同樣的問題也可能影響某些附加模組的建置,因此在這些情況下,請在 dmake 命令列上指定「-m serial」,或改用 /usr/ccs/bin/make。如果您想要使用 GNU make,請務必確認未設定群組 ID 位元。如果已設定,請調整您的 PATH,讓 /usr/ccs/bin/make 在 GNU make 之前,或者請系統管理員停用 GNU make 上的群組 ID 位元。

避免使用 libucb。

Solaris 在 /usr/ucblib/libucb.a 中提供一些 BSD 相容性函式。如果連結至 -lucb,perl 將無法正確建置和執行,因為它包含與標準 Solaris libc 不相容的常式。這通常不是問題,因為 solaris 提示檔案會阻止 Configure 甚至在 /usr/ucblib 中尋找函式庫,而且也會明確省略 -lucb。

在 Solaris 上編譯 perl 的環境

PATH

請務必讓您的 PATH 包括編譯器(如果您使用 Sun 的編譯器,則為 /opt/SUNWspro/bin/)以及 /usr/ccs/bin/,以選取其他開發工具(例如 make、ar、as 和 ld)。請務必讓您的路徑不包含 /usr/ucb,或是在編譯器、編譯器工具和其他標準 Solaris 目錄之後包含它。您絕對不想要 /usr/ucb/cc。

LD_LIBRARY_PATH

如果您已設定 LD_LIBRARY_PATH 環境變數,請務必讓它不包含 /lib 或 /usr/lib。如果您將建置呼叫第三方共用函式庫(例如 Berkeley DB)的擴充功能,請務必讓您的 LD_LIBRARY_PATH 環境變數包含該函式庫的目錄(例如 /usr/local/lib)。

如果您收到錯誤訊息

dlopen: stub interception failed

這可能是因為您的 LD_LIBRARY_PATH 環境變數包含指向 /usr/lib 的目錄(例如 /lib)。這會造成問題的原因相當微妙。libdl.so.1.0 檔案實際上*只*包含會產生「stub interception failed」錯誤的函式!執行時期連結器會攔截連結至「/usr/lib/libdl.so.1.0」的連結,並連結至這些函式的內部實作。[感謝 Tim Bunce 提供此說明。]

執行設定。

請參閱 INSTALL 檔案,以取得關於設定的一般資訊。這裡只討論特定於 Solaris 的問題。通常,預設值應該沒問題。

Solaris 上的 64 位元 perl。

請參閱 INSTALL 檔案,以取得關於 64 位元編譯的一般資訊。一般來說,預設值應該對大多數人來說沒問題。

預設情況下,perl-5.6.0(或更新版本)會編譯為支援大檔案和 long-long 的 32 位元應用程式。

一般 32 位元與 64 位元問題。

Solaris 7 以上版本會透過重新開機,在 SPARC CPU 上以 32 位元或 64 位元模式執行。您可以在執行 32 位元模式時建置 64 位元應用程式,反之亦然。32 位元應用程式會在執行 32 或 64 位元模式的 Solaris 下執行。64 位元應用程式需要 Solaris 以 64 位元模式執行。

現有的 32 位元應用程式通常稱為 LP32,亦即 Longs 和 Pointers 是 32 位元。64 位元應用程式更適當地稱為 LP64。LP64 位元應用程式的區別特徵是它能夠使用 64 位元地址空間。完全有可能有一個支援 64 位元整數 (long long) 和大檔案 (> 2GB) 的 LP32 位元應用程式,而這是 perl-5.6.0 的預設值。

如需更完整的 64 位元問題說明,請參閱 http://docs.sun.com/ 上的「Solaris 64 位元開發人員指南」。

您可以使用「isainfo -v」來偵測作業系統模式,例如:

$ isainfo -v   # Ultra 30 in 64 bit mode
64-bit sparcv9 applications
32-bit sparc applications

預設情況下,perl 將會編譯為 32 位元應用程式。除非您想要在 perl 內部配置超過約 4GB 的記憶體,或者除非您需要超過 255 個開啟的檔案描述符,否則您可能不需要 perl 成為 64 位元應用程式。

大檔案支援

對於 Solaris 2.6 及更新版本,32 位元應用程式有兩種不同的方式來處理大檔案(檔案大小 > 2GB)。(64 位元應用程式預設自動內建大檔案支援。)

首先是「過渡編譯環境」,如 lfcompile64(5) 中所述。根據手冊頁面,

The transitional compilation  environment  exports  all  the
explicit 64-bit functions (xxx64()) and types in addition to
all the regular functions (xxx()) and types. Both xxx()  and
xxx64()  functions  are  available to the program source.  A
32-bit application must use the xxx64() functions in  order
to  access  large  files.  See the lf64(5) manual page for a
complete listing of the 64-bit transitional interfaces.

過渡編譯環境可透過下列編譯器和連結器旗標取得

getconf LFS64_CFLAGS        -D_LARGEFILE64_SOURCE
getconf LFS64_LDFLAG        # nothing special needed
getconf LFS64_LIBS          # nothing special needed

第二個是 lfcompile(5) 中所述的「大型檔案編譯環境」。根據手冊頁面,

Each interface named xxx() that needs to access 64-bit entities
to  access  large  files maps to a xxx64() call in the
resulting binary. All relevant data types are defined to  be
of correct size (for example, off_t has a typedef definition
for a 64-bit entity).

An application compiled in this environment is able  to  use
the  xxx()  source interfaces to access both large and small
files, rather than having to explicitly utilize the  transitional
xxx64()  interface  calls to access large files.

fseek() 和 ftell() 為兩個例外。32 位元應用程式應使用 fseeko(3C) 和 ftello(3C)。這些會自動對應到 fseeko64() 和 ftello64()。

大型檔案編譯環境可透過下列取得

getconf LFS_CFLAGS      -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
getconf LFS_LDFLAGS     # nothing special needed
getconf LFS_LIBS        # nothing special needed

預設情況下,perl 使用大型檔案編譯環境,並依賴 Solaris 執行介面的底層對應。

建立 LP64 perl

要在 UltraSparc 上使用最新 Sun 編譯器編譯 64 位元應用程式,您需要使用旗標「-xarch=v9」。getconf(1) 會告訴您這一點,例如:

$ getconf -a | grep v9
XBS5_LP64_OFF64_CFLAGS:         -xarch=v9
XBS5_LP64_OFF64_LDFLAGS:        -xarch=v9
XBS5_LP64_OFF64_LINTFLAGS:      -xarch=v9
XBS5_LPBIG_OFFBIG_CFLAGS:       -xarch=v9
XBS5_LPBIG_OFFBIG_LDFLAGS:      -xarch=v9
XBS5_LPBIG_OFFBIG_LINTFLAGS:    -xarch=v9
_XBS5_LP64_OFF64_CFLAGS:        -xarch=v9
_XBS5_LP64_OFF64_LDFLAGS:       -xarch=v9
_XBS5_LP64_OFF64_LINTFLAGS:     -xarch=v9
_XBS5_LPBIG_OFFBIG_CFLAGS:      -xarch=v9
_XBS5_LPBIG_OFFBIG_LDFLAGS:     -xarch=v9
_XBS5_LPBIG_OFFBIG_LINTFLAGS:   -xarch=v9

在 UltraSparc 系統上使用 Solaris 7 或更新版本時,Sun WorkShop 編譯器 5.0 及更新版本(現在以 Forte 名稱行銷)支援此旗標。

如果您使用 gcc,則需要改用 -mcpu=v9 -m64。gcc 2.95.2 尚未支援此選項;根據該版本的 install/SPECIFIC

GCC version 2.95 is not able to compile code correctly for sparc64
targets. Users of the Linux kernel, at least, can use the sparc32
program to start up a new shell invocation with an environment that
causes configure to recognize (via uname -a) the system as sparc-*-*
instead.

如果要求,所有這些都應由提示檔案自動處理。

長雙精度。

從 5.8.1 開始,如果您使用 Sun 編譯器(需要額外的數學常式,而 libm 中未包含),則長雙精度會運作。

Solaris 上 perl 中的執行緒。

可以在 Solaris 上建立 perl 的執行緒版本。不過,整個 perl 執行緒實作仍屬於實驗性質,因此請小心。

Solaris 上 perl 的 Malloc 問題。

從 perl 5.7.1 開始,perl 使用 Solaris malloc,因為 perl malloc 在處理超過 2GB 的記憶體時會中斷,而且 Solaris malloc 似乎也比較快。

如果您出於某些原因(例如二進位向後相容性)真的需要使用 perl 的 malloc,您可以從原始碼重新建置 perl,並使用下列方式設定建置

$ sh Configure -Dusemymalloc

如果您使用 gcc 進行建置,則不應使用 perl 的 malloc。有報告指出會產生核心傾印,特別是在 PDL 模組中。問題似乎會在 -DDEBUGGING 下消失,因此很難追蹤。Sun 的編譯器無論是否使用 perl 的 malloc,似乎都正常。[XXX 此處需要進一步調查。]

MAKE 問題。

使用 GNU as 和 GNU ld 的動態載入問題

如果您在 SunOS 或 Solaris 上使用 gcc 載入動態時遇到問題,而且您使用的是 GNU as 和 GNU ld,請參閱上方的「GNU as 和 GNU ld」區段。

ld.so.1: ./perl: fatal: relocation error

如果您在 SunOS 或 Solaris 上收到此訊息,而且您使用的是 gcc,這可能是前一個項目「GNU as 和 GNU ld」中的 GNU as 或 GNU ld 問題。

dlopen: stub interception failed

「dlopen: stub interception failed」訊息的主要原因是 LD_LIBRARY_PATH 環境變數包含一個目錄,該目錄是 /usr/lib 的符號連結(例如 /lib)。請參閱上方的「LD_LIBRARY_PATH」。

#error "No DATAMODEL_NATIVE specified"

這是嘗試使用 Solaris 2.5 或 2.5.1 的 gcc 安裝在 Solaris 2.6 上建置 perl 時常見的錯誤。Solaris 標頭檔已變更,因此您需要更新您的 gcc 安裝。您可以重新執行 gcc 的 fixincludes 腳本,或更新您的 gcc 安裝。

sh: ar: not found

這是您的 shell 傳遞的訊息,告訴您找不到「ar」指令。您需要檢查您的 PATH 環境變數,以確保其中包含「ar」指令的目錄。這是 Solaris 上的常見問題,其中「ar」位於 /usr/ccs/bin/ 目錄中。

MAKE TEST

op/stat.t 測試 4 在 Solaris 中

op/stat.t 測試 4 如果你在某種類型的 tmpfs 上,可能會失敗。有時在 /tmp 中建置會顯示此行為。測試套件會偵測你是否在 /tmp 中建置,但它可能無法捕捉所有 tmpfs 情況。

nss_delete 核心傾印來自 op/pwent 或 op/grent

請參閱 perlhpux 中的「nss_delete 核心傾印來自 op/pwent 或 op/grent」

CROSS-COMPILATION

這裡沒有什麼不尋常的。如果你有可用的交叉編譯器,你可以輕鬆執行此操作;當目標為 Solaris x86 時,通常的 Configure 呼叫看起來像這樣

sh ./Configure -des -Dusecrosscompile \
    -Dcc=i386-pc-solaris2.11-gcc      \
    -Dsysroot=$SYSROOT                \
    -Alddlflags=" -Wl,-z,notext"      \
    -Dtargethost=... # The usual cross-compilation options

lddlflags 新增是唯一的異常位元。

SOLARIS 的 PERL 預建二進位檔。

你可以從 http://www.sunfreeware.com/http://www.blastwave.org、ActiveState http://www.activestate.com/http://www.perl.com/ 取得 Solaris 的預建二進位檔,這些網站位於頁面頂端的二進位檔清單中。可能還有其他來源。請注意,這些網站由其各自的所有者控制,而不是 perl 開發人員。

SOLARIS 上 PERL 的執行時期問題。

Solaris 上開啟檔案數量的限制。

stdio(3C) 手冊頁面指出,對於 LP32 應用程式,只能使用 fopen() 開啟 255 個檔案,而且串流中只能使用 0 到 255 的檔案描述符。由於 Perl 會呼叫 open(),然後使用產生的檔案描述符呼叫 fdopen(3C),因此 Perl 限制同時開啟 255 個檔案,即使使用了 sysopen()。如果這證明是一個無法克服的問題,您可以將 Perl 編譯為 LP64 應用程式,請參閱「建立 LP64 Perl」以取得詳細資料。另請注意,Solaris 上開啟檔案描述符的預設資源限制為 255,因此您必須適當地修改您的 ulimit 或 rctl (Solaris 9 以上)。

SOLARIS 特定模組。

請參閱 CPAN 上 Solaris:: 和 Sun::Solaris 名稱空間下的模組,請參閱 http://www.cpan.org/modules/by-module/Solaris/http://www.cpan.org/modules/by-module/Sun/

SOLARIS 特定模組問題。

Solaris 上的 Proc::ProcessTable

如果您已定義 LARGEFILES,則 Proc::ProcessTable 無法在 Solaris 上使用 perl5.6.0 和更高版本編譯。由於大檔案支援是 5.6.0 和更高版本的預設值,因此您必須採取特殊步驟才能使用此模組。

問題在於透過 procfs 可見的各種結構使用 off_t,如果您使用大檔案支援編譯,這些結構會從 32 位元變更為 64 位元。因此,您從 procfs 取得的內容與 Perl 中的結構不符,導致產生垃圾。請參閱 proc(4) 以取得進一步的討論。

Proc::ProcessTable 的修正方法是編輯 Makefile,從 MakeMaker 從 Config.pm 取得的旗標中明確移除大檔案旗標。這將導致 Proc::ProcessTable 在正確的環境下建置。只要 Proc::ProcessTable 沒有嘗試與 Perl 的其餘部分共用 off_t,或者如果它有,則應明確指定為 off64_t,那麼一切都應該沒問題。

Solaris 上的 BSD::Resource

由於與 Proc::ProcessTable 相同的原因,早於 1.09 的 BSD::Resource 版本無法在 Solaris 上使用 Perl 5.6.0 和更高版本編譯。從 1.09 開始的 BSD::Resource 版本已解決此問題。

Solaris 上的 Net::SSLeay

Net::SSLeay 需要一個 /dev/urandom。此裝置在 Solaris 9 之後才提供。對於較早的 Solaris 版本,你可以取得 SUNWski 套件(與多個 Sun 軟體產品一同封裝,例如 Sun WebServer,這是 Solaris Server Intranet Extension 的一部分,或 Sun Directory Services,這是 Solaris for ISPs 的一部分),或從 http://www.cosy.sbg.ac.at/~andi/ 下載 ANDIrand 套件。如果你使用 SUNWski,請建立一個指向 /dev/random 的 /dev/urandom 符號連結。如需更多詳細資訊,請參閱文件 ID27606,標題為「Solaris[TM] 作業環境中不同的 /dev/random 支援需求」,可從 http://sunsolve.sun.com 取得。

可以使用 Entropy Gathering Daemon(以 Perl 編寫!),可從 http://www.lothar.com/tech/crypto/ 取得。

SunOS 4.x

在 SunOS 4.x 中,你很可能會想要使用 SunOS ld,/usr/bin/ld,因為較新的 GNU ld 版本(例如 2.13)似乎無法再用於建置 Perl。在連結延伸模組時,GNU ld 會非常不開心,並會吐出許多類似這樣的錯誤

... relocation truncated to fit: BASE13 ...

然後就掛了。因此,SunOS 4.1 提示檔案會明確設定 ld 為 /usr/bin/ld

從 Perl 5.8.1 開始,在 SunOS 4.x 中,動態載入函式庫(DynaLoader、XSLoader)似乎也已經損壞。因此,預設會以靜態方式建置 Perl。

在 SunOS 4.1 中執行測試套件有點棘手,因為 dist/Tie-File/t/09_gen_rs.t 測試會掛住(子測試 #51,供你參考),原因不明。只要停止測試並終止那個 Perl 程序即可。

還有許多其他失敗,在 SunOS 4.1.4 和 gcc 3.2.2 中看起來很像 gcc 錯誤。許多失敗發生在 Encode 測試中,例如,當測試預期「0」時,你會得到「0」,這在仔細看過後應該會覺得很奇怪。另一個範例出現在 t/run/fresh_perl 的前面,預期 chr(0xff),但測試失敗,因為結果是 chr(0xff)。完全正確。

這是上述組合的「make test」結果

Failed 27 test scripts out of 745, 96.38% okay.

執行 harness 很痛苦,因為許多失敗的 Unicode 相關測試會輸出數百萬位元組的失敗訊息,但如果你耐心等待,你會得到這些結果

Failed Test                     Stat Wstat Total Fail  Failed  List of Failed
-----------------------------------------------------------------------------
...
../ext/Encode/t/at-cn.t            4  1024    29    4  13.79%  14-17
../ext/Encode/t/at-tw.t           10  2560    17   10  58.82%  2 4 6 8 10 12
                                                               14-17
../ext/Encode/t/enc_data.t        29  7424    ??   ??       %  ??
../ext/Encode/t/enc_eucjp.t       29  7424    ??   ??       %  ??
../ext/Encode/t/enc_module.t      29  7424    ??   ??       %  ??
../ext/Encode/t/encoding.t        29  7424    ??   ??       %  ??
../ext/Encode/t/grow.t            12  3072    24   12  50.00%  2 4 6 8 10 12 14
                                                               16 18 20 22 24
 Failed Test                     Stat Wstat Total Fail  Failed  List of Failed
------------------------------------------------------------------------------
../ext/Encode/t/guess.t          255 65280    29   40 137.93%  10-29
../ext/Encode/t/jperl.t           29  7424    15   30 200.00%  1-15
../ext/Encode/t/mime-header.t      2   512    10    2  20.00%  2-3
../ext/Encode/t/perlio.t          22  5632    38   22  57.89%  1-4 9-16 19-20
                                                               23-24 27-32
../ext/List/Util/t/shuffle.t       0   139    ??   ??       %  ??
../ext/PerlIO/t/encoding.t                    14    1   7.14%  11
../ext/PerlIO/t/fallback.t                     9    2  22.22%  3 5
../ext/Socket/t/socketpair.t       0     2    45   70 155.56%  11-45
../lib/CPAN/t/vcmp.t                          30    1   3.33%  25
../lib/Tie/File/t/09_gen_rs.t      0    15    ??   ??       %  ??
../lib/Unicode/Collate/t/test.t              199   30  15.08%  7 26-27 71-75
                                                               81-88 95 101
                                                               103-104 106 108-
                                                               109 122 124 161
                                                               169-172
../lib/sort.t                      0   139   119   26  21.85%  107-119
op/alarm.t                                     4    1  25.00%  4
op/utfhash.t                                  97    1   1.03%  31
run/fresh_perl.t                              91    1   1.10%  32
uni/tr_7jis.t                                 ??   ??       %  ??
uni/tr_eucjp.t                    29  7424     6   12 200.00%  1-6
uni/tr_sjis.t                     29  7424     6   12 200.00%  1-6
56 tests and 467 subtests skipped.
Failed 27/811 test scripts, 96.67% okay. 1383/75399 subtests failed,
  98.17% okay.

alarm() 測試失敗是由於 system() 顯然會封鎖 alarm()。這可能是 libc 錯誤,而且考量到 SunOS 4.x 已在多年前結束生命週期,不要期待會有修正。除此之外,不要嘗試任何過於 Unicode 的東西,特別是 Encode,你應該可以在 SunOS 4.x 中順利使用。

作者

原始文件由 Andy Dougherty doughera@lafayette.edu 撰寫,並大量參考 Alan Burlison、Nick Ing-Simmons、Tim Bunce 以及多年來許多其他 Solaris 使用者的建議。

請將任何錯誤、更新或建議回報至 https://github.com/Perl/perl5/issues