preverify 是 J2ME 開發工具鏈中的關鍵工具,負責驗證 J2SE 編譯產出的 class 檔案是否符合 MIDP 裝置執行規範。然而,即便是最簡單的 HelloWorld 類別,在特定環境下執行 preverify 時也會拋出 Segmentation fault 錯誤,導致驗證流程中斷。
[root@localhost uCLinux]# ./preverify -classpath classes.zip -verbose HelloWorld
[Output directory for verified classes: output]
Segmentation fault
經排查,錯誤源於系統語系設定為 UTF-8 編碼。無論使用中文或英文語系,只要採用 UTF-8 字元集,preverify 即會因字元編碼處理缺陷觸發段錯誤。
[root@localhost uCLinux]# echo $LANG
en_US.UTF-8
[root@localhost uCLinux]# export LANG=en_US.ISO8859-1
[root@localhost uCLinux]# echo $LANG
en_US.ISO8859-1
[root@localhost uCLinux]# ./preverify -classpath classes.zip -verbose HelloWorld
[Output directory for verified classes: output]
[Loaded Java/lang/Object] from [classes.zip]
[Loaded Java/lang/Class] from [classes.zip]
[Loaded Java/lang/String] from [classes.zip]
[Loaded Java/lang/Throwable] from [classes.zip]
[Loaded Java/lang/IllegalArgumentException] from [classes.zip]
[Loaded Java/lang/RuntimeException] from [classes.zip]
[Loaded Java/lang/Exception] from [classes.zip]
[Loaded Java/lang/StringIndexOutOfBoundsException] from [classes.zip]
[Loaded Java/lang/IndexOutOfBoundsException] from [classes.zip]
[Loaded Java/io/InputStream] from [classes.zip]
[Loaded com/sun/cldc/io/ResourceInputStream] from [classes.zip]
[Loaded ./HelloWorld.class]
驗證成功完成,所有核心類別正確載入。
此問題屬於早期 J2ME 工具鏈在 Linux 環境下的已知缺陷,preverify 內部字串處理邏輯未正確支援 UTF-8 多位元組字元集。現代開發環境(WTK 2.5+、Java ME SDK 3.0+)已修復此問題,但在維護舊專案或嵌入式交叉編譯環境時仍可能遇到。建議在建構腳本中預先設定 export LANG=C 或 en_US.ISO8859-1 以規避風險。