Почему ASLR не выключается для значений из кучи?

Скажем, я хочу отладить структуру данных и для простоты хочу иметь одинаковые адреса в памяти. Очевидно, что для этого нужно отключить ASLR. Потому поступаю как в этом ответе.

Процесс запускается от администратора. В ProcessHacker в этом процессе вижу, что ASLR выключен.

Вот пример программы:

#include<iostream>


struct Node {
     int Data;
     Node* next;
};

Node* add(Node* head, int Value)
{
     Node* New = new Node;
     New->Data = Value;
     New->next = head;
     return New;
}

void Show(Node* head)
{
     while (head)
     {
          printf("%p \n", head);
          head = head->next;
     }
     printf("Adress of show func %p\n", &Show);
     while (1);
     
}


int main()
{
     Node* a = nullptr;

     for (int i = 0; i < 5; i++)
          a = add(a, i);

     Show(a);

}

Первый запуск программы:

005AED48
005A5538
005A5500
005A5680
005A5648
Adress of show func 00411447

Второй запуск:

006E5538
006E5500
006E5680
006E5648
006E05A0
Adress of show func 00411447

Почему адреса значений из кучи всё ещё рандомизируются? Я хочу, чтобы они повторялись от запуска к запуску


Ответы (2 шт):

Автор решения: Elvin

Действителльно, @user7860670 прав. Куча всегда рандомизирована и отключение ASLR повлиять на это не может. В этом ответе сказано:

Heaps and some other strucutres are randomized always.

→ Ссылка
Автор решения: HolyBlackCat

Говорят, что на линуксе помогает echo 0 | sudo tee /proc/sys/kernel/randomize_va_space.

Источник

→ Ссылка