Macos Mac OS X上的Lua编译脚本-英特尔vs PPC
在MacOSX通用二进制应用程序中使用Lua5.0已有几年了。Lua脚本使用luac编译,编译后的脚本与应用程序捆绑在一起。他们在Tiger and Leopard、Intel或PPC中正常工作 为了避免当时出现库问题,我只是简单地将Lua src树添加到我的Xcode项目中,并按原样编译,没有任何问题 是时候更新到更现代的Lua版本了,所以我用5.1.4的源代码树替换了我的源代码树。我使用makemacosx重新构建了luac(机器在英特尔上运行Leopard) 未编译的脚本一如既往地在Tiger and Leopard、Intel和PPC中正常工作 但是,现在编译的脚本无法加载到PPC机器上 所以我用“ansi”标志重新构建了luac,并重新编译了我的脚本。同样的错误。类似地,“generic”的构建标志也没有带来任何乐趣Macos Mac OS X上的Lua编译脚本-英特尔vs PPC,macos,lua,cross-compiling,luac,Macos,Lua,Cross Compiling,Luac,在MacOSX通用二进制应用程序中使用Lua5.0已有几年了。Lua脚本使用luac编译,编译后的脚本与应用程序捆绑在一起。他们在Tiger and Leopard、Intel或PPC中正常工作 为了避免当时出现库问题,我只是简单地将Lua src树添加到我的Xcode项目中,并按原样编译,没有任何问题 是时候更新到更现代的Lua版本了,所以我用5.1.4的源代码树替换了我的源代码树。我使用makemacosx重新构建了luac(机器在英特尔上运行Leopard) 未编译的脚本一如既往地在Tig
谁能告诉我下一步该做什么 Lua的编译脚本基本上是在一个简短的头文件之后转储出来的原始字节码。头文件记录了用于编译字节码的平台的一些属性,但加载程序只验证当前平台是否具有相同的属性 不幸的是,当加载在另一个平台上编译的字节码时,即使是由同一版本的Lua编译的字节码,也会产生问题。当然,由不同版本的Lua编译的脚本不可能正常工作,因为Lua的版本号包含在字节码头中,所以内核会捕获加载它们的尝试 简单的答案就是不要编译脚本。如果Lua自己编译脚本,您只需担心应用程序的各种构建中Lua核心之间可能存在的版本不匹配,这并不难处理 实际上,支持编译字节码的完全交叉兼容性是非常重要的。在那封电子邮件中,Mike Pall发现了以下问题:
sizeof(size\u t)
,影响巨大的字符串常量:在
降级sizeof(int)
,影响MAXARG\u Bx
和MAXARG\u sBx
:在
降级typeof(lua\u Number)
:在C语言中很容易,但仅当主机和目标
遵循相同的FP标准;精确
升级时丢失(罕见情况);
发生错误时警告非整数
降级到int32
memcmp()
进行比较,以获得与文件头的精确匹配,因此任何不匹配都会导致stock loader()拒绝该文件
/*
* make header
*/
void luaU_header (char* h)
{
int x=1;
memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1);
h+=sizeof(LUA_SIGNATURE)-1;
*h++=(char)LUAC_VERSION;
*h++=(char)LUAC_FORMAT;
*h++=(char)*(char*)&x; /* endianness */
*h++=(char)sizeof(int);
*h++=(char)sizeof(size_t);
*h++=(char)sizeof(Instruction);
*h++=(char)sizeof(lua_Number);
*h++=(char)(((lua_Number)0.5)==0); /* is lua_Number integral? */
}
可以看出,标题长度为12个字节,包含签名(4个字节,“Lua
”)、版本和格式代码、用于结尾的标志字节、类型的大小int
、size\u t
、指令
和Lua\u编号
,以及指示Lua\u编号
是否为整型的标志
这允许捕捉大多数平台差异,但并不试图捕捉平台差异的所有方式
我仍然支持上面提出的建议:第一,提供可编译的源代码;第二,定制
ldump.c
和lundump.c
以存储和加载通用格式,另外注意,任何自定义格式都应重新定义标头的LUAC_格式字节,以免与库存字节码格式混淆。Lua字节码不可移植。您应该随应用程序一起提供源脚本
如果需要考虑下载大小,则它们通常比字节码形式短
如果知识产权是一个问题,您可以使用代码混淆器,并记住,分解Lua字节码绝非易事
如果需要考虑加载时间,您可以在安装脚本中本地预编译源代码。您可能需要使用支持不同endianness的修补字节码加载程序。
请参阅。我猜想您是在英特尔上编译脚本的