6

http://lua-users.org/wiki/SimpleLuaApiExampleの簡単な例を使用してテストを行います。サンプルは libluajit.a と静的にリンクできますが、実行すると次のエラー メッセージが表示されます。

Segmentation fault: 11

2012-11-08 にリリースされた LuaJIT-2.0.0 を使用しています。私のOSは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はどちらもhereから来ています。フォルダー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

しかし、lj2/src/luajit.c を test.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  
4

1 に答える 1

10

問題が解決しました。このページに LuaJIT を埋め込む方法を説明するセクションがあります:
http://luajit.org/install.html

  • > LuaJIT に対して直接的または間接的にリンクする OSX 上で 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-13T12:39:14.053 に答える