luajit2.0.0——分段错误:11

luajit2.0.0——分段错误:11,lua,luajit,Lua,Luajit,我使用来自的一个简单示例进行测试。该示例可以与libluajit.a静态链接,但成功链接后,运行该示例时会出现以下错误消息: Segmentation fault: 11 我使用2012年11月8日发布的LuaJIT-2.0.0。我的操作系统是Mac OSX Lion 10.7.5 $ uname -a Darwin macmatoMacBook-Pro.local 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 201

我使用来自的一个简单示例进行测试。该示例可以与libluajit.a静态链接,但成功链接后,运行该示例时会出现以下错误消息:

Segmentation fault: 11
我使用2012年11月8日发布的LuaJIT-2.0.0。我的操作系统是Mac OSX Lion 10.7.5

$ uname -a
Darwin macmatoMacBook-Pro.local 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:25:48 PDT 2012; root:xnu-1699.32.7~1/RELEASE_X86_64 x86_64
测试步骤如下:

编译luajit-2.0.0 编译并运行示例应用程序 test.cscript.lua都来自。文件夹lj2包含刚刚成功编译的上述luajit-2.0.0的源代码

$ ls
lj2 script.lua test.c 
使用铿锵编译器
$ clang -o test test.c -I./lj2/src -L./lj2/src -lluajit
$ ./test
Segmentation fault: 11
使用gcc编译器
$ gcc -o test test.c -I./lj2/src -L./lj2/src -lluajit
$ ./test 
Segmentation fault: 11

但是如果我用test.c替换lj2/src/luajit.c,它将给我带来成功。这很奇怪。见下文:

$ cd lj2
$ make clean
$ mv src/luajit.c src/luajit.c.orig 
$ cp ../test.c src/luajit.c
$ make
$ cp src/luajit ../
$ cd ..
$ ./luajit
The table the script received has:
1   2
2   4
3   6
4   8
5   10
Returning data back to C
Script returned: 30  

问题解决了。有一节解释了如何在此页面中嵌入LuaJIT:

  • 如果您正在OSX上构建一个直接或间接链接到>LuaJIT的64位应用程序,则需要使用以下标志链接主可执行文件:

    -pagezero\u大小10000-图像\u基数100000000

此外,建议重新设置在OSX/x64上运行时加载的所有(自编译)共享库的基础(例如,Lua的C扩展模块)。见:man rebase

现在,让我再次测试它:

$ clang -o test test.c -O3 -I./lj2/src -L./lj2/src -lluajit -pagezero_size 10000 -image_base 100000000
$ ./test 
The table the script received has:
1   2
2   4
3   6
4   8
5   10
Returning data back to C
Script returned: 30
瓦尔格林回来了

$ valgrind ./test
bad executable (__PAGEZERO is not 4 GB)
valgrind: ./test: cannot execute binary file

这是另一个问题。

作为luajit构建的一部分,您可能应该进行
sudomakeinstall
。还有,你为什么要静态链接它?@finnw我想在我的应用程序中嵌入luajit。
$ valgrind ./test
bad executable (__PAGEZERO is not 4 GB)
valgrind: ./test: cannot execute binary file