luajit编译过程的一些坑
在lua5.1迁移到luajit的过程中,遇到了很多坑,现在记录一下,也告诫一下后来人。
项目地址,Windows和POSIX分开。
1. Windows下编译
1.1 使用MSVC编译
在src目录下,运行:
msvcbuild
之后,将src目录下的 luajit.exe 还有 lua51.dll 拷贝到其他目录下,新建 lua 和 lua/jit 两个文件夹,并把 src/jit 目录下所有lua文件拷贝到 lua/jit 文件夹下。
1.2 使用MSYS编译
和UNIX系统相同,见下文。
1.3 使用mingw编译
放弃吧,mingw有bug,编译不了luajit,推测是mingw自带的minge32-make.exe和msys/cgywin带的make.exe并不相同导致。
2. POSIX系统下编译
2.1 全局安装
把luajit全局非常简单,只要在luajit源代码根目录下,运行:
make
sudo make install
即可
2.2 安装到指定路径
如果说安装到指定路径,你一定会想当然的说:
make install PREFIX=/home/myself/luajit
执行此命令后,确实会在指定目录生成 bin 、 lib 、 include 、 man 等文件夹,但是添加动态链接指向此目录后,却并不能链接成功,然后告诉你 /usr/local/lib
目录下没有luajit的动态库。
查阅文档,才发现,在make
时,luajit默认指定动态库安装目录为 /usr/local
。如果要修改,在make
时就要指定动态库路径。
make PREFIX=/home/myself/luajit
make install PREFIX=/home/myself/luajit
2.3 在OSX下使用luajit的坑
编写一个lua交互式解释器(源代码),在linux和windows上都正常,在MAC OS下就无法运行,通过检查,发现lua_State *L = luaL_newstate()
这步返回结果为NULL,就是说在OSX上luajit初始化有问题。
通过查资料,发现64位OSX在使用luajit存在一个内存分配相关的bug,为了避免此bug,需要在链接时加上如下参数
-pagezero_size 10000 -image_base 100000000
同样的,如果使用ios 64bit simulator调试程序时,也需要在链接时添加这两个参数(真机调试不需要)。
这个情况比较复杂,愿意看的可以看看,不愿意看或看不懂也无所谓。
64bit drawin系统使用luajit需要rebase的原因
LuaJIT需要最少2GB(2^31)的虚拟地址空间用来进行操作。也就是说,对于64位指针,它的高33位需要置0 (64位cpu兼容32位指令集的一种方法,高32位和正常32位指令集相同)。
问题是,默认情况下,64位的drawin(含osx和ios)的连接器标记的4GB地址空间是从0x00000000开始保留(即保留高32位)。正常情况下,(苹果)认为这是一种理想状态,没有使用任何RAM(它只是虚拟 地址空间,而不是真实内存)。(这样的限制也有很多好处,比如说程序员不会因为误操作直接或间接的把32位整数转换为指针了,@指针声明的时候总忘了*的我)
-pagezero_size
标记可以让编译器检查范围由4gb变小(但仍然有捕捉指针异常的功能,比如null),让程序可用的地址空间变大。
-image_base
标记告诉链接器程序代码不会使用0x0000 0001 0000 0000以下的内存地址。(0x1 0000 0000 = 2^33)