Компиляция разделяемой библиотеки JNI, которая использует LuaJIT
Я пытаюсь сделать разделяемую библиотеку C, которая использует LuaJIT и использовать ее в Java через JNI. Моя платформа - OS X (El Capitan).
gcc -Wall -shared -fpic \
ath_lua_runtime_foundation_LuaScriptApi.c \
-ILuaJIT-2.0.4/src/ \
-I/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/include/darwin/ \
-I/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/include/ \
-L. \
-lluajit \
-o libEmbeddedLua.jnilib
Он компилируется правильно, но когда я вызываю его функцию в Java, происходит сбой JVM
SIGSEGV (0xb) at pc=0x00007fff04c5bcd0, pid=37283, tid=5891
...
Problematic frame:
C [libluajit-5.1.2.dylib+0x11cd0] lua_pushcclosure+0x10
Как упомянуто в документации, для OS X я должен использовать следующие параметры GCC (и это работает, когда я создаю тестовый исполняемый файл):
-pagezero_size 10000 -image_base 100000000
но эти параметры действительны только для исполняемых файлов, но не для общей библиотеки.
Вопрос в том, как заставить его работать в общей библиотеке.
1 ответ
У меня была такая же проблема. Это конкретно проблема 64-битных macOS, и Майк Палл обсуждает ее здесь. Если вы скомпилируете 32-битный LuaJIT из исходного кода, все будет работать. Чтобы создать 32-разрядный двоичный файл LuaJIT, вы можете запустить следующее в каталоге LuaJIT:
CFLAGS="-arch i386" GCCFLAGS="-arch i386" LDFLAGS="-arch i386" make && sudo make install