gpt4 book ai didi

macos - Lua 在 Mac OS X 上编译脚本 - Intel vs PPC

转载 作者:行者123 更新时间:2023-12-03 18:18:43 24 4
gpt4 key购买 nike

多年来一直在 Mac OS X 通用二进制应用程序中使用 Lua 5.0。 Lua 脚本使用 luac 编译,编译后的脚本与应用程序捆绑在一起。它们在 Tiger 和 Leopard、Intel 或 PPC 中都能正常工作。

为了避免当时的库问题,我只是将 Lua src 树添加到我的 Xcode 项目中并按原样编译,没有任何问题。

是时候更新到更现代的 Lua 版本了,所以我用 5.1.4 的源代码树替换了我的源代码树。我使用 重建了 luac制作 macosx (机器在英特尔上运行 Leopard)。

未编译 脚本在 Tiger 和 Leopard、Intel 和 PPC 中一如既往地正常工作。

然而,现在已编译 脚本无法在 PPC 机器上加载。

所以我用'ansi'标志重建了luac,并重新编译了我的脚本。同样的错误。同样,“通用”的构建标志也没有带来任何乐趣。

任何人都可以请建议我下一步可以做什么吗?

最佳答案

Lua 的编译脚本几乎是在一个短头之后转储出来的原始字节码。头文件记录了用于编译字节码的平台的一些属性,但加载器仅验证当前平台是否具有相同的属性。

不幸的是,这在加载在另一个平台上编译的字节码时会产生问题,即使是由相同版本的 Lua 编译的。当然,不同版本的 Lua 编译的脚本不能指望能正常工作,而且由于 Lua 的版本号包含在字节码头中,因此加载它们的尝试被核心捕获。

简单的答案是不要编译脚本。如果 Lua 自己编译脚本,您只需担心应用程序的各种构建中 Lua 内核之间可能的版本不匹配,这并不难处理。

实际上支持编译字节码的完全交叉兼容性是 not easy .在该电子邮件中,迈克·鲍尔确定了以下问题:

  1. Endianess: swap on output as needed.

  2. sizeof(size_t), affects huge string constants: check for overflow when downgrading.

  3. sizeof(int), affectsMAXARG_Bx and MAXARG_sBx: check for overflow when downgrading.

  4. typeof(lua_Number): easy in C, but only when the host and the target follow the same FP standard; precision loss when upgrading (rare case); warn about non-integer numbers when downgrading to int32.



从我在邮件列表上看到的关于这个问题的所有讨论中,我看到了两种可能的可行方法,假设您不愿意考虑只发送未编译的 Lua 脚本。

第一个是在加载编译的脚本时修复字节顺序。事实证明,这比您预期的要容易,因为它可以通过替换读取脚本文件的低级函数来完成,而无需重新编译内核本身。事实上,它甚至可以在纯 Lua 中完成,通过提供您自己的 chunk reader函数到 lua_load() .只要您的平台上唯一的兼容性问题是字节顺序,这应该有效。

第二个是修补内核本身,以便在所有平台上对已编译的脚本使用通用表示。这已被 Luiz Henrique de Figueiredo 描述为可能:

.... I'm convinced that the best route to byte order or cross-compiling is third-party dump/undump pairs. The files ldump.c and lundump.c are completely replaceable; they export a single, well-defined, entry point. The format of precompiled chunks is not sacred at all; you can use any format, as long as ldump.c and lundump.c agree about it. (For instance, Rici Lake is considering writing a text format for precompiled chunks.) ....



就个人而言,我建议认真考虑不要预编译脚本,从而完全避免平台可移植性问题。

编辑:由于 lhf 的评论,我已经更新了我对字节码 header 的描述。我还没有阅读 Lua 源代码的这一部分,我可能应该先检查一下,然后再对标题中存在或不存在哪些信息非常自信。

这是来自 lundump.c 的片段它形成与运行平台匹配的 header 副本,用于与正在加载的字节码进行比较。简单对比 memcmp()为了与文件中的标题完全匹配,因此任何不匹配都会导致库存加载器( luaU_undump() )拒绝该文件。
/*
* 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 个字节,“ <esc>Lua”)、版本和格式代码、字节序标志字节、类型 int 的大小。 , size_t , Instruction , 和 lua_Number , 以及指示是否 lua_Number 的标志是一个整数类型。

这允许捕获大多数平台差异,但不会 try catch 平台可能不同的所有方式。

我仍然支持上面提出的建议:首先,提供可编译的源;或者第二,定制 ldump.clundump.c存储和加载通用格式,另外要注意的是,任何自定义格式都应重新定义 header 的 LUAC_FORMAT 字节,以免与股票字节码格式混淆。

关于macos - Lua 在 Mac OS X 上编译脚本 - Intel vs PPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1047236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com