@Shchvova, Когда компилятор генерит машинный код, он складывает сам код в кучку, которую называет сегментом кода (этот сегмент можно выполнять и читать, но нельзя писать), сегментом данных (сюда можно писать, но нельзя выполнять), и вот специальный сегмент по виртуальному адресу 0, в эпловском бинарнике он называется __PAGEZERO, который нельзя ни читать ни писать. То есть когда ты в ссишной программе обращаешься к NULL, тебя кидает на этот самый адрес 0 и генерится segmentation fault, потому что туда обращаться нельзя :)
Вот ос, когда читает бинарник, выделяет каждому описанному сегменту виртуальной памяти сколько он попросит и/или поместит по каким попросит адресам. В случае если никаких указаний нет, то она под __PAGEZERO выделяет 4Гб виртуальной памяти (специально против хитрожопых приложений, которые заявляют что умеют 64 бит, а на деле пользуются 32-битными указателями) и все 32-битные указатели из-за этого ломаются. Но в luajit оказались еще хитрее, и вместо того что переписать код на 64-битные указатели, требуют от тебя чтоб ты упихал 64-битное приложение при сборке в 32-бита адресного пространства, вот с помощью этих команд.