關於lua位元組碼在32位和64位系統上不相容的問題

2022-08-28 11:48:15 字數 748 閱讀 2022

使用32位的lua虛擬機器編譯出來的位元組碼,無法被64位的lua虛擬機器識別。反過來也一樣不能識別。

實際上,主要問題出現在了序列化上。因為lua在讀/寫位元組碼的時候,有兩個地方使用到了size_t型別變數來存貯長度,乙個是讀/寫字串,乙個是檔案頭部的size_t長度校驗。而size_t是平台密切相關的,size_t型別變數的位元組數和指標變數的位元組數相等(sizeof(size_t) = sizeof(void*p)),因此在32、64位的系統上各不相同。

經過測試,將序列化和反序列化過程中涉及到的size_t型別換成uint32_t,在32和64位虛擬機器輸出的位元組碼就完全一樣了。

目前尚不清楚,lua虛擬機器在序列化時為何使用size_t而不是uint32_t來表示長度。

載入位元組碼檔案:lundump.c

寫入位元組碼檔案:ldump.c

將這兩個檔案中,涉及到存檔的size_t,換成uint32_t或者luai_uint32

該方法不適用於相容16位機器。在16位機器上sizeof(int)可能為2,所以跟32和64位機器差別就非常大了,要改動的地方就比較多了。

該方法也不適用於luajit。因為我沒看過luajit原始碼,不確定如何去修改。

32位和64位系統區別及位元組對齊

1 64bit cpu擁有更大的定址能力,最大支援到16gb記憶體 因為目前cpu位址匯流排為34條,條,定址範圍2 10 2 10 2 10 2 4 16g 而32bit只支援4g記憶體 有32位匯流排 2 64位cpu一次可提取64位資料,比32位提高了一倍,理論上效能會提公升1倍。但這是建立在...

32位和64位各變數位元組數

資料型別編譯配置 x86x64 char 1字元1字元 short 2字元2字元 int4字元 4字元long 4字元4字元 longlong 8字元8字元 float 4字元4字元 double 8字元8字元 long double 8字元8字元 wchar t 2字元2字元 bool 1字元1字...

32位和64位系統區別和資料位元組

1 64bit cpu擁有更大的定址能力。2 64位cpu一次可提取64位資料,比32位提高了一倍,理論上效能會提公升1倍。但這是建立在64bit作業系統,64bit軟體的基礎上的。什麼是64位處理器?之所以叫做 64位處理器 是因為電腦內部都是實行2進製運算,處理器 cpu 一次處理資料的能力也是...