Рандомизация разметки адресного пространства (ALSR) и mmap

Я ожидаю, что из-за рандомизации адресного пространства (ALSR) процесс, разветвленный из другого процесса, будет иметь другие адреса, возвращаемые при вызове mmap . Но, как я выяснил, это было не так. Для этого я сделал следующую тестовую программу. Все адреса, возвращаемые функцией malloc , абсолютно одинаковы для родительского и дочернего элементов. Обратите внимание, что malloc для cl1 , cl2 , pl1 , pl2 внутренне использует mmap ] потому что они большие блоки.

Итак, у меня вопрос, почему mmap не возвращает разные адреса даже при наличии ALSR. Возможно, это потому, что исходное значение для рандомизации здесь одинаково для исходного и разветвленного процесса. Или есть какая-то другая причина?

int main()
{
  pid = fork();

  if (pid == 0)                // child
  {
    void * c1 = malloc( 4096 );
    void * c2 = malloc( 4096 );

    void * cl1 = malloc( (long)512e3 ); // internally uses mmap
    void * cl2 = malloc( (long)512e3 ); // internally uses mmap

    printf( "c1 = %p, c2 = %p, cl1 = %p, cl2 = %p!\n", c1, c2, cl1, cl2 );
  }
  else
  {
    void * p1 = malloc( 4096 );
    void * p2 = malloc( 4096 );

    void * pl1 = malloc( (long)512e3 ); // internally uses mmap
    void * pl2 = malloc( (long)512e3 ); // internally uses mmap

    printf( "p1 = %p, p2 = %p, pl1 = %p, pl2 = %p!\n", p1, p2, pl1, pl2 );
  }

  return 0;
}
5
задан MetallicPriest 28 February 2012 в 18:53
поделиться