В OS X 10.9 (Mavericks) можно отключить рандомизацию расположения пространства адресов для одного процесса, если вы запустите процесс путем вызова posix_spawn()
и передать недокументированный атрибут 0x100
. Вот так:
extern char **environ;
pid_t pid;
posix_spawnattr_t attr;
posix_spawnattr_init(&attr);
posix_spawnattr_setflags(&attr, 0x100);
posix_spawn(&pid, argv[0], NULL, &attr, argv, environ);
(Это реконструировано из Источники Apple GDB.)
Проблема с недокументированными функциями вроде этого заключается в том, что они, как правило, исчезают без предупреждения. В соответствии с этот ответ динамический компоновщик dyld
, используемый для консультаций с переменная окружения DYLD_NO_PIE
, но это не работает в 10.9; аналогичным образом статический линкер, по-видимому, использовал параметр --no-pie
, но это уже не так.
Итак, существует документированный способ отключения ASLR?
(Причина, по которой мне нужно отключить ASLR, заключается в обеспечении повторяемости при тестировании и отладке кода, поведение которого зависит от адресов объектов, например хэш-таблиц на основе адресов и Менеджеры памяти на базе BIBOP.)