来自: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可执行文件了。

【转】Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱的更多相关文章

  1. Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱

    前情提要:由于苹果要求2015年2月1日上架的新app必须支持64位的arm64,旧的app也得在6月1日支持64位,来源.于是unity3d弄出了il2cpp这种花式的玩法来进行64位支持,而对于当 ...

  2. JuiceFS v1.0.0 Beta1 发布,加强数据安全能力

    在 JuiceFS 开源一周年之际,我们迎来了首个里程碑版本 JuiceFS v1.0.0 Beta1,并将开源许可从 AGPL v3 修改为 Apache License 2.0. JuiceFS ...

  3. Redis 3.0正式版发布,正式支持Redis集群

    Redis是一个开源.基于C语言.基于内存亦可持久化的高性能NoSQL数据库,同时,它还提供了多种语言的API.近日,Redis 3.0在经过6个RC版本后,其正式版终于发布了.Redis 3.0的最 ...

  4. RDIFramework.NET平台代码生成器V3.0版本全新发布-更新于20160518(提供下载)

    最新版本请转到:RDIFramework.NET平台代码生成器V3.1版本全新发布-更新于2016-10-08(提供下载) RDIFramework.NET代码生成器V3.0版本修改了针对3.0版本的 ...

  5. Bootstrap v4.0.0-alpha.5 发布,大量更新

    Bootstrap v4.0.0-alpha.5 发布了,Bootstrap是快速开发Web应用程序的前端工具包.它是一个CSS和HTML的集合,它使用了最新的浏览器技术,给你的Web开发提供了时尚的 ...

  6. Ionic 2.0.0-rc.1 发布,HTML5 移动应用框架

    Ionic 2.0.0-rc.1 发布了,Ionic Framework 是个高级的 HTML5 移动端应用框架,是个很漂亮的使用 HTML5 开发混合移动应用前端框架.本次更新内容如下: Bug 修 ...

  7. MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题

    ///MVC4.0中项目发布遇到IE11时session存入URL中,导致记不住密码的问题,在webconfig中配置<system.web><authentication mode ...

  8. log-malloc2 0.2.4 发布

    log-malloc2 0.2.4 发布了,该版本修复了日志格式输出的 bug. og-malloc2 是一个 malloc 日志预加载库,用于检测内存泄漏问题.

  9. TypeScript 0.9.1 发布,新增 typeof 关键字

    TypeScript 0.9.1 发布了,该版本提升了编译器和语言的性能,增加新的语言特性 typeof ,更好的 this 处理等.详细介绍请看发行说明. TypeScript 是微软新推出的一种语 ...

随机推荐

  1. JUC线程池之 线程池的5种状态:Running, SHUTDOWN, STOP, TIDYING, TERMINATED

    线程池有5种状态:Running, SHUTDOWN, STOP, TIDYING, TERMINATED. 线程池状态定义代码如下: private final AtomicInteger ctl ...

  2. winform自定义控件 (转帖)

    定义控件 本文以按钮为例,制作一个imagebutton,继承系统button, 分四种状态 1,正常状态 2,获得焦点 3,按下按钮 4,禁用 当然你得准备一张图片,包含四种状态的样式,同样你也可以 ...

  3. 使用gulp 合并压缩打包,实时监控文件,实现本地server

    今天不讲webpack,就说说gulp是怎么进行压缩合并打包 首先你的安装gulp : npm install gulp -g --save-dev 然后最基本的你因该知道gulp 的四个方法, gu ...

  4. golang 如何判断变量的类型

    本文介绍两种用于判断变量类型的方式. 方法一 package main import ( "fmt" ) func main() { v1 := "123456" ...

  5. ORA-01919: role 'OLAPI_TRACE_USER' does not exist

    我在用数据泵导入数据的时候报的错 TEST_USER1@ORCL> conn / as sysdbaSYS@ORCL> grant plustrace to TEST_USER1; gra ...

  6. 关于有时候导入maven项目时候报错(有红色叹号,类中导入的包提示"the import java.util cannot be resolve,")

    ------解决方案--------------------解决方案:右键项目-------buildpath--------最下面那个configura...的选择libraries找到JRE(这个 ...

  7. python之BeautifulSoup4的例子

    仅作演示用 from bs4 import BeautifulSoup import urllib.request webfile = urllib.request.urlopen('http://w ...

  8. REDHAT中的iptable设置(nginx或者apache80端口访问不了解决)转 亲测

    来自:http://johnnychenjun.blog.163.com/blog/static/137493406201010284598972/ 查看当前防火墙里的状态:#/etc/init.d/ ...

  9. yii framework config 可以被配置的项目

    http://hi.baidu.com/lossless1009/item/990fdb33a52ffcf1e7bb7a4c <?php002 003 // 取消下行的注释,来定义一个路径别名0 ...

  10. 如何手动关闭tomcat服务,不在Eclipse中的server里按那个红色按钮关

    首先,找到Tomcat服务器的安装目录bin目录下的shutdown.bat.然后拖动到命令行进行操作,将Tomcat服务器关闭~ 将shutdown.bat 文件拖至命令行操作当中,执行该命令,即可 ...