luajit2.0.0 - Ошибка сегментации: 11
Я использую простой пример из http://lua-users.org/wiki/SimpleLuaApiExample чтобы сделать тест. Образец может быть статически связан с libluajit.a с успехом, но это сообщение об ошибке появляется, когда вы запускаете его:
Segmentation fault: 11
Я использую LuaJIT-2.0.0, выпущенный 2012-11-08. Моя ОС 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.c, и script.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
Но если я заменю 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
1 ответ
Проблема решена. Есть раздел, который объясняет, как встраивать LuaJIT на этой странице:
http://luajit.org/install.html
Если вы создаете 64-разрядное приложение на OSX, которое прямо или косвенно ссылается на> LuaJIT, вам нужно связать ваш основной исполняемый файл с такими флагами:
-pagezero_size 10000 -image_base 100000000
Кроме того, рекомендуется перебазировать все (самостоятельно скомпилированные) разделяемые библиотеки, которые загружаются во время выполнения в OSX/x64 (например, модули расширения C для Lua). Смотрите: человек ребаз
Теперь позвольте мне проверить это снова:
$ 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
Это другой вопрос.