Почему адрес функции различается до и после запуска кода?

исходный код здесь

      #include <stdio.h>

int gcd(a, b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}

int main(int argc, char **argv) {
  int a = atoi(argv[1]);
  int b = atoi(argv[2]);
  int res = gcd(a, b);
  printf("%d\n", res);
  return 0;
}

и скомпилирован с gcc -O0 gcd.c -o gcd -g

Прежде чем я запустил gcd, gcd() адрес 0x1169. После запуска адрес той же функции становится 0x555555555169.

      $ gdb -q gcd
Reading symbols from gcd...

(gdb) p gcd
$1 = {int (int, int)} 0x1169 <gcd>

(gdb) run 42 24
Starting program: ~/Workstation/gcd 42 24
6
[Inferior 1 (process 104126) exited normally]

(gdb) p gcd
$2 = {int (int, int)} 0x555555555169 <gcd>

Почему существует такая разница между запуском кода и после него?

1 ответ

Это связано с рандомизацией разметки адресного пространства. Короче говоря, это означает, что модули / библиотеки / исполняемые файлы будут каждый раз загружаться по разным адресам.

Другие вопросы по тегам