我使用http://lua-users.org/wiki/SimpleLuaApiExample中的一个简单示例进行测试.该示例可以与libluajit.a静态链接并成功,但运行时会出现此错误消息:
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)
我使用的是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
Run Code Online (Sandbox Code Playgroud)
测试步骤:
$ 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 ..
Run Code Online (Sandbox Code Playgroud)
无论test.c的和script.lua来自这里.文件夹lj2包含上面luajit-2.0.0的源代码,刚编译成功.
$ ls
lj2 script.lua test.c
Run Code Online (Sandbox Code Playgroud)
使用clang编译器
$ clang -o test test.c -I./lj2/src -L./lj2/src -lluajit
$ ./test
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)
使用gcc编译器
$ gcc -o test test.c -I./lj2/src -L./lj2/src -lluajit
$ ./test
Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)
但是如果我用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
Run Code Online (Sandbox Code Playgroud)
dou*_*uyw 10
问题解决了.有一节介绍如何在此页面中嵌入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
Run Code Online (Sandbox Code Playgroud)
而valgrind回归
$ valgrind ./test
bad executable (__PAGEZERO is not 4 GB)
valgrind: ./test: cannot execute binary file
Run Code Online (Sandbox Code Playgroud)
那是另一个问题.
| 归档时间: |
|
| 查看次数: |
1798 次 |
| 最近记录: |