前情提要:由于苹果要求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的解脱

    来自:Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱 前情提要:由于苹果要求2015年2月1日上架的新app必须支持64位的arm64,旧的app也得在6月1日支持 ...

  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. IOS-常用第三方开源框架介绍

    iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 时间:2015-05-06 16:43:34      阅读:533      评论:0      收藏:0      [点我收藏+] ...

  2. IIS网页GZIP压缩

    1.开GZIP有什么好处? 答:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度. 2.如何启用IIS的Gzip压缩功能: 答:首先,如果你需 ...

  3. oracle创建定时器详解|interval属性

    定时任务首先先创建定时任务中的存储过程 create or replace procedure pro_jggl as                                          ...

  4. fiddler手机端抓包配置

    首先,你得安装fiddler,这是前提条件,手机抓包有必须条件: 需要保持电脑和手机在同一个局域网中 (这一点,我一般会在电脑上启动一个wifi,然后手机连接即可) 下面说一下如何配置: 手机连接电脑 ...

  5. Java 反射机制介绍

    参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还 ...

  6. Linux运维学习笔记-文件系统知识体系总结

    文件系统知识总结 新买的硬盘要存放数据需要怎么做? 首先将硬盘装机做RAID,做完RAID后进行分区,分完区后格式化创建文件系统,最后存放数据. 硬盘的内外部结构: 物理形状: 接口类型: IDE(I ...

  7. 2018-2019第一学期C语言助教总结

    博客作业成绩统计表 学号 第一次成绩 第二次成绩 第三次成绩 第四次成绩 第五次成绩 4022 75 84 75 64 75 4023 90 80 74 83 78 4024 75 63 61 60 ...

  8. Codeforces 868F. Yet Another Minimization Problem【决策单调性优化DP】【分治】【莫队】

    LINK 题目大意 给你一个序列分成k段 每一段的代价是满足\((a_i=a_j)\)的无序数对\((i,j)\)的个数 求最小的代价 思路 首先有一个暴力dp的思路是\(dp_{i,k}=min(d ...

  9. 便捷的Jenkins jswidgets

    很多时候我们在构建完成之后需要查看构建的状态,类似github 中的build Status 插件安装 搜索插件 使用 目前好像只支持自由项目的构建 代码集成 <!DOCTYPE html> ...

  10. 02 - Unit07:显示笔记下拉菜单、笔记的分享功能、笔记的删除功能

    显示笔记下拉菜单 笔记的分享功能 发送Ajax请求 绑定事件:绑定分享按钮单击事件 参数获取:笔记ID 发送请求:/share/add.do 服务器处理 ShareController ShareSe ...