Luajit-2.1.0-beta1的發布和生成arm64用bytecode的解脫


前情提要:由於蘋果要求2015年2月1日上架的新app必須支持64位的arm64,舊的app也得在6月1日支持64位,來源。於是unity3d弄出了il2cpp這種花式的玩法來進行64位支持,而對於當時的大多數采用luajit的cocos2d-x用戶而言,就只能選擇換成lua本身(32位和64位的字節碼還是不同)或者不編譯成二進制的字節碼,只是混淆一下源代碼來保持64位兼容,但是這樣對於代碼的保護就不到位了(雖然大家都很忙,也不會有人太閑着來看這些代碼)不過能夠用上luajit的字節碼還是會讓人踏實很多。

很快在luajit的maillist出現了相關arm64的詢問,作者也給出了詳細的方案,詳情可見這里;接着這位叫哎呀的熱心人就在他的博客上給出了可以生成arm64下的字節碼的方案,第一篇第二篇。是對maillist的總結和實踐最后給出的方案,至此luajit的2.1.0alpha版可以生成arm64的字節碼了,cocos2dx的app更新的時候只需根據__arm64__的預編譯宏定義修改一下lualoader,帶上32位和64位的字節碼就可以歡快的跑在arm64cpu的iphone5s及以上手機了。

至此為止,看上去一切已經圓滿了,只是app的體積會增大出一份64位字節碼的代碼大小,但是可以換來更加放心的代碼保護和加快加載的速度也是值得的,不過正如luajit的作者在maillist里面的回答以及哎呀在第二篇博客上給出的方案所留下的尾巴,想要生成64位的字節碼並不是一件容易的事情,必須在字節碼的目標平台上生成,也就是要在iphone5s以上的手機上才能生成,生成完了還要通過ftp的形式發回到做包的機器上,簡直是自動化流程的究極噩夢,一旦更新了代碼就得在手機上去生成一下然后傳回到pc或者mac上,想着就覺得頭疼。雖然后來愛折騰的同學實現了iphone6p一鍵編譯完成后自動上傳到更新pc上的功能,卻時常在更新時忘了去點那么一下……

於是最后luajit作者在maillist上那句話就成了我一直念念不忘的[Eventually there'll be a native x64 interpreter with LJ_GC64 and LJ_FR2, then you could use that one.]

……回響……

昨天發現luajit在8月25號更新,趕緊下下來看了看更新日志(官網的更新日志並沒有更新到最新版本),發現了兩條

  • Add LJ_GC64 mode: 64 bit GC object references (really: 47 bit). Interpreter-only for now.
  • Add LJ_FR2 mode: Two-slot frame info. Required by LJ_GC64 mode.

頓時覺得有戲了,雖然作者並沒有給出生成的方案,但查看了一下代碼,最后在lj_arch.h里面發現了LUAJIT_ENABLE_GC64的宏定義,正是開啟LJ_GC64的關鍵,開啟宏定義之后在linux下編譯生成的luajit執行文件就可以生成出和在arm64的iphone下一模一樣的字節碼了,從此解放了iphone,感謝luajit的作者Mike Pall ,本來我還一直擔心luajit不再繼續維護的。

ps:  作者在此提到了這個宏定義

patch:

最近我又發現在windows下面沒法正確的通過msvcbuild編譯出luajit的x64可執行文件,如果定義了LUAJIT_ENABLE_GC64這個宏,編譯會出錯:buildvm_arch.h(1281): error C2039: 'J': is not a member of 'GG_State'.

這樣的話就只能在linux的gcc64下面編譯,十分不甘心。繼續深挖之后發現還是有辦法的,

首先當然要在vs2015 x64 native command prompt下面運行luajit/src/msvcbuild.bat,在lj_arch.h的開始#define LUAJIT_ENABLE_GC64。然后修改msvcbuild.bat文件,去掉第一個-D JIT,也就是關閉jit,變成這樣:@set DASMFLAGS=-D WIN -D FFI -D P64;

然后將vm_x86.dasc修改為vm_x64.dasc,否則雖然可以編譯出來可執行文件,但是運行就出錯退出。經過這兩處修改之后就可以在windows下的vs里編譯出可以生成兼容arm64的bytecode的luajit可執行文件了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM