全局变量W / O -fPIC的位置

问题描述 投票:0回答:1

尽管存在一些职位对-fPIC效果(参见例如this SO post)大部分都不清楚。我写了一个非常简单的例子,我仍然无法弄清楚发生了什么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地址应该是整个运行没有相同?

c global-variables fpic
1个回答
2
投票

在首字母缩写词(或initialism):ASLR - 地址空间布局随机化。

维基百科上ASLR说:

ASLR随机安排的过程的关键数据的区域,包括可执行的基部和栈,堆和库的位置的地址空间中的位置。

这说明你所看到的。你后来发现,使用:

 echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

转ASLR关闭意味着地址是相同的跨越运行时,用或不用-fPIC,从而确认ASLR是的地址改变的原因。

请注意,您的地址打印应该使用的%p格式和void *争论(虽然你有一个潜在的截断数据转换时应用(int)投给的地址 - 但格式正确使用%d)。类型改性剂tptrdiff_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;
}
© www.soinside.com 2019 - 2024. All rights reserved.