全局变量的位置 w/o -fPIC
Location of global variables w/o -fPIC
尽管存在一些关于 -fPIC
效果的帖子(例如参见 [=18=]),但其中大部分都不清楚。我写了一个非常简单的例子,但我仍然无法弄清楚 w/o -fPIC
关于全局变量的位置会发生什么。这是我的 C 文件:
$ cat main.c
#include <stdio.h>
int var1 = 94;
int var2 = 76;
int main(int argc, char **argv)
{
int var1Loc = (int) &var1;
int var2Loc = (int) &var2;
printf("var1 address is: %d\n",var1Loc);
printf("var2 address is: %d\n",var2Loc);
printf("diff is: %d\n",var2Loc-var1Loc);
return var1+var2;
}
然后我用-fPIC
和运行编译了两次:
$ gcc -Wno-pointer-to-int-cast -O0 -g -o main main.c
$ ./main
var1 address is: -2019672048
var2 address is: -2019672044
diff is: 4
$ ./main
var1 address is: 1441697808
var2 address is: 1441697812
diff is: 4
当我做完全相同的事情时 没有 -fPIC
我得到类似的结果。我以为没有 -fPIC
地址
在 运行 之间应该相同 否?
首字母缩略词(或 initialism):ASLR — 地址 Space 布局随机化。
ASLR 上的维基百科说:
ASLR randomly arranges the address space positions of key data areas of a process, including the base of the executable and the positions of the stack, heap and libraries.
这描述了您所看到的。您随后发现使用:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
关闭 ASLR 意味着地址在运行中是相同的,无论有无 -fPIC
,从而确认 ASLR 是地址更改的原因。
请注意,您的地址打印可能应该使用 %p
格式和 void *
参数(尽管在对地址应用 (int)
转换时可能会截断数据转换 —但使用 %d
的格式是正确的)。类型修饰符t
是针对ptrdiff_t
,两个指针的区别
#include <stdio.h>
int var1 = 94;
int var2 = 76;
int main(void)
{
void *var1Loc = &var1;
void *var2Loc = &var2;
printf("var1 address is: %p\n", var1Loc);
printf("var2 address is: %p\n", var2Loc);
printf("diff is: %td\n", &var2 - &var1);
return 0;
}
尽管存在一些关于 -fPIC
效果的帖子(例如参见 [=18=]),但其中大部分都不清楚。我写了一个非常简单的例子,但我仍然无法弄清楚 w/o -fPIC
关于全局变量的位置会发生什么。这是我的 C 文件:
$ cat main.c
#include <stdio.h>
int var1 = 94;
int var2 = 76;
int main(int argc, char **argv)
{
int var1Loc = (int) &var1;
int var2Loc = (int) &var2;
printf("var1 address is: %d\n",var1Loc);
printf("var2 address is: %d\n",var2Loc);
printf("diff is: %d\n",var2Loc-var1Loc);
return var1+var2;
}
然后我用-fPIC
和运行编译了两次:
$ gcc -Wno-pointer-to-int-cast -O0 -g -o main main.c
$ ./main
var1 address is: -2019672048
var2 address is: -2019672044
diff is: 4
$ ./main
var1 address is: 1441697808
var2 address is: 1441697812
diff is: 4
当我做完全相同的事情时 没有 -fPIC
我得到类似的结果。我以为没有 -fPIC
地址
在 运行 之间应该相同 否?
首字母缩略词(或 initialism):ASLR — 地址 Space 布局随机化。
ASLR 上的维基百科说:
ASLR randomly arranges the address space positions of key data areas of a process, including the base of the executable and the positions of the stack, heap and libraries.
这描述了您所看到的。您随后发现使用:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
关闭 ASLR 意味着地址在运行中是相同的,无论有无 -fPIC
,从而确认 ASLR 是地址更改的原因。
请注意,您的地址打印可能应该使用 %p
格式和 void *
参数(尽管在对地址应用 (int)
转换时可能会截断数据转换 —但使用 %d
的格式是正确的)。类型修饰符t
是针对ptrdiff_t
,两个指针的区别
#include <stdio.h>
int var1 = 94;
int var2 = 76;
int main(void)
{
void *var1Loc = &var1;
void *var2Loc = &var2;
printf("var1 address is: %p\n", var1Loc);
printf("var2 address is: %p\n", var2Loc);
printf("diff is: %td\n", &var2 - &var1);
return 0;
}