2

源代码在这里

#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>

为什么在运行代码之前和之后会有如此大的差异?

4

1 回答 1

0

这是由于地址空间布局随机化。简而言之,这意味着每次加载模块/库/可执行文件将位于不同的地址。

于 2021-04-29T06:29:39.917 回答