Компиляция разделяемой библиотеки 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

Другие вопросы по тегам