Replies (9)

  • @Shchvova, Если я все правильно понял, luajit использует внутри себя "для скорости" 32-битные указатели, поэтому ему нужно полностью влезть в первые 4Гб виртуальной памяти. Тогда как линкер эпла по умолчанию создает сегменты по 4Гб. То есть первая инструкция уменьшает PAGEZERO-сегмент до 10кб, вторая — говорит что базовый адрес надо начинать с 100000000, типа тогда все ссылки внутри приложения будут относительны 100010000 и должны влезть в 32 бита.
  • @vt, а что такое pagezero сегмент?
  • @Shchvova, Когда компилятор генерит машинный код, он складывает сам код в кучку, которую называет сегментом кода (этот сегмент можно выполнять и читать, но нельзя писать), сегментом данных (сюда можно писать, но нельзя выполнять), и вот специальный сегмент по виртуальному адресу 0, в эпловском бинарнике он называется __PAGEZERO, который нельзя ни читать ни писать. То есть когда ты в ссишной программе обращаешься к NULL, тебя кидает на этот самый адрес 0 и генерится segmentation fault, потому что туда обращаться нельзя :)
    Вот ос, когда читает бинарник, выделяет каждому описанному сегменту виртуальной памяти сколько он попросит и/или поместит по каким попросит адресам. В случае если никаких указаний нет, то она под __PAGEZERO выделяет 4Гб виртуальной памяти (специально против хитрожопых приложений, которые заявляют что умеют 64 бит, а на деле пользуются 32-битными указателями) и все 32-битные указатели из-за этого ломаются. Но в luajit оказались еще хитрее, и вместо того что переписать код на 64-битные указатели, требуют от тебя чтоб ты упихал 64-битное приложение при сборке в 32-бита адресного пространства, вот с помощью этих команд.
  • @vt, спасибо. Очень клево пояснил!
  • @vt, а можешь так же про image_base?
  • @Shchvova, image_base — это адрес, начиная с которого ос грузит все твои байтики из бинарника и относительно которого рассчитываются все адреса. То есть мы говорим компилятору-линкеру "а давай ты возьмешь за базу адрес 100000000 и все сложишь туда, а то тупой luajit дальше чем 0xffffffff прыгать не умеет"
  • @vt, эм... Типа все адреса функций будут начинаться с 100000000. А типа по дефолту больше?
  • @Shchvova, Да, это дефолты для 32-битной ОС, на 64-битной другие цифры.
  • @vt, спасибо кстате. Очень помог!