Я работаю над системой времени выполнения для параллельных программ, которые могут использовать общий макет адресного пространства для нескольких процессов, потенциально распространяемых на несколько (тысяч) узлов. Много раз программное обеспечение, созданное для этой среды, запускается в системах Linux, которые по умолчанию имеют рандомизацию адресного пространства, и пользователи могут не захотеть или иметь возможность отключить ее в рамках всей системы (через sysctl -w kernel.randomize_va_space=0
и т.п.). Это накладывает некоторые ограничения на параллельные программы и может повредить производительность. Таким образом, мы хотим выяснить, как отключить его для двоичных файлов, которые мы создаем. Безопасность не является проблемой, так как это программное обеспечение всегда работает в контролируемых средах.
Я нашел ссылки на различные флаги и переменные, такие как ET_EXEC
, EF_AS_NO_RANDOM
(видимо, никогда не сливался?) и PF_RANDOMIZE
, но я не могу найти какой-либо документ, который описывает, что я могу сделать, чтобы установить эти флаги. Идеальный ответ подскажет мне, какой флаг компилятора/ассемблера/компоновщика отключит рандомизацию для результирующего двоичного файла и какие версии этой цепочки/ядра будут работать. Следующим лучшим будет инструмент, который делает то же самое после создания двоичного файла.
Поскольку я уверен, что кто-то предложит это, я уже знаю, что мы можем сделать это изменение во время выполнения с setarch -R
, но предпочтительнее записать это в исполняемом файле.
Похоже, что paxctl -rx
должен сделать трюк, но он, похоже, не применим к текущему методу, используемому в ядрах, которые не включают патчи PAX.