luajit2.0.0 -- 分段错误:11

我使用了一个来自http://lua-users.org/wiki/SimpleLuaApiExample的简单示例来进行测试。这个样本可以与libluajit.a静态链接,并且可以成功,但是当你运行它时,出现了以下错误:

Segmentation fault: 11

我使用的是2012-11-08发布的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

$ cd lj2
$ ls
COPYRIGHT Makefile  README    doc       dynasm    etc       src
$ make
==== Building LuaJIT 2.0.0 ====
make -C src
DYNLINK   libluajit.so
LINK      luajit
OK        Successfully built LuaJIT
==== Successfully built LuaJIT 2.0.0 ====
$ rm src/*.so            # force to use the static version: libluajit.a
$ cd ..

编译和运行示例应用程序

test.cscript.lua都来自这里。文件夹lj2包含上面的luajit-2.0.0的源代码,刚才已经成功编译了。

$ ls
lj2 script.lua test.c

使用clang编译器

$ 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
点赞
用户618981
用户618981

问题已解决。本文中有一节讲解如何嵌入 LuaJIT:

http://luajit.org/install.html

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

    -pagezero_size 10000 -image_base 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 返回:

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

这是另一个问题。

2012-11-13 12:39:14