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 
use clang compiler
$ clang -o test test.c -I./lj2/src -L./lj2/src -lluajit
$ ./test
Segmentation fault: 11
use gcc compiler
$ 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  

person douyw    schedule 13.11.2012    source แหล่งที่มา
comment
คุณน่าจะทำ sudo make install เป็นส่วนหนึ่งของการสร้าง luajit เหตุใดคุณจึงต้องการเชื่อมโยงแบบคงที่   -  person finnw    schedule 13.11.2012
comment
@finnw ฉันต้องการฝัง luajit ในแอปของฉัน   -  person douyw    schedule 13.11.2012


คำตอบ (1)


แก้ไขปัญหาแล้ว มีส่วนที่อธิบายวิธีการฝัง LuaJIT ในหน้านี้:
http://luajit.org/install.html

  • หากคุณกำลังสร้างแอปพลิเคชัน 64 บิตบน OSX ซึ่งลิงก์โดยตรงหรือโดยอ้อมกับ > LuaJIT คุณจะต้องลิงก์ไฟล์ปฏิบัติการหลักของคุณกับแฟล็กเหล่านี้:

    -pagezero_size 10,000 -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

นั่นเป็นอีกคำถามหนึ่ง

person douyw    schedule 13.11.2012