我想知道linux内存对齐和布局

我想知道linux内存对齐和布局,linux,memory,fedora,Linux,Memory,Fedora,下面代码示例中的两个奇怪的外观没有意义 为什么foo和argv[0]之间的距离总是不同的 为什么不与4对齐?虽然预期结果是4的倍数,但并非如此 我想知道这些奇怪的表情的详细原因 我知道这和我的工作无关 [root@localhost~]#cat/etc/fedora发布 软呢帽第14版(劳克林) [root@localhost~]#cat poc.c #包括 int main(int argc,char*argv[]){ int foo; printf(“%d\n”,(int)argv[0]-(

下面代码示例中的两个奇怪的外观没有意义

  • 为什么
    foo
    argv[0]
    之间的距离总是不同的
  • 为什么不与4对齐?虽然预期结果是4的倍数,但并非如此
  • 我想知道这些奇怪的表情的详细原因

    我知道这和我的工作无关

    [root@localhost~]#cat/etc/fedora发布
    软呢帽第14版(劳克林)
    [root@localhost~]#cat poc.c
    #包括
    int main(int argc,char*argv[]){
    int foo;
    printf(“%d\n”,(int)argv[0]-(int)&foo);
    }
    [root@localhost~]#/poc
    5345
    [root@localhost~]#/poc
    8465
    [root@localhost~]#/poc
    4641
    [root@localhost~]#/poc
    1201
    [root@localhost~]#/poc
    2881
    [root@localhost~]#/poc
    7073
    [root@localhost~]#/poc
    5905
    [root@localhost~]#/poc
    2225
    [root@localhost~]#/poc
    2465
    [root@localhost~]#/poc
    6017
    [root@localhost~]#/poc
    8657
    [root@localhost~]#/poc
    8401
    [root@localhost~]#/poc
    5073
    [root@localhost~]#/poc
    5505
    [root@localhost~]#/poc
    1761
    [root@localhost~]#/poc
    8609
    [root@localhost~]#/poc
    3665
    [root@localhost~]#/poc
    3633
    [root@localhost~]#/poc
    6257
    [root@localhost~]#/poc
    3441
    [root@localhost~]#/poc
    4961
    [root@localhost~]#/poc
    5233
    [root@localhost~]#/poc
    561
    [root@localhost~]#/poc
    3441
    [root@localhost~]#/poc
    2097
    [root@localhost~]#/poc
    1729
    [root@localhost~]#/poc
    1841
    [root@localhost~]#/poc
    2241
    [root@localhost~]#/poc
    2145
    [root@localhost~]#/poc
    6593
    [root@localhost~]#/poc
    5681
    [root@localhost~]#/poc
    737
    [root@localhost~]#/poc
    8353
    [root@localhost~]#/poc
    1937
    [root@localhost~]#/poc
    3937
    [root@localhost~]#/poc
    4769
    [root@localhost~]#/poc
    3441
    [root@localhost~]#/poc
    6097
    [root@localhost~]#/poc
    6673
    [root@localhost~]#/poc
    1857
    [root@localhost~]#/poc
    5617
    [root@localhost~]#/poc
    5473
    [root@localhost~]#/poc
    7313
    [root@localhost~]#/poc
    3921
    [root@localhost~]#/poc
    2369
    [root@localhost~]#/poc
    4609
    [root@localhost~]#/poc
    5569
    [root@localhost~]#/poc
    6209
    [root@localhost~]#/poc
    3457
    [root@localhost~]#/poc
    3665
    [root@localhost~]#/poc
    3297
    [root@localhost~]#/poc
    4465
    [root@localhost~]#/poc
    5281
    [root@localhost~]#/poc
    6017
    [root@localhost~]#/poc
    2705
    [root@localhost~]#/poc
    1601
    [root@localhost~]#/poc
    7457
    [root@localhost~]#/poc
    4145
    [root@localhost~]#/poc
    2353
    [root@localhost~]#/poc
    5537
    [root@localhost~]#/poc
    7873
    [root@localhost~]#/poc
    6449
    [root@localhost~]#/poc
    3297
    
    1。为什么foo和argv[0]之间的距离总是不同?

    因为ASLR

    我知道这与ASLR无关

    你确定吗?内核的虚拟地址空间随机化参数值是多少?应该是0

    2。为什么不与4对齐?虽然预期结果是4的倍数,但并不

    你想用它来演示什么?代码计算从argv中的第一个字符串到局部变量foo的距离。这有什么意义

    处理参数和局部变量的方式和位置实际上取决于操作系统和编译器。请看下面的帖子:

    [root@localhost ~]# cat /etc/fedora-release 
    Fedora release 14 (Laughlin)
    [root@localhost ~]# cat poc.c
    #include <stdio.h>
    int main(int argc, char *argv[]){
    int foo;
        printf("%d\n",  (int)argv[0] - (int)&foo);
    }
    [root@localhost ~]# ./poc
    5345
    [root@localhost ~]# ./poc
    8465
    [root@localhost ~]# ./poc
    4641
    [root@localhost ~]# ./poc
    1201
    [root@localhost ~]# ./poc
    2881
    [root@localhost ~]# ./poc
    7073
    [root@localhost ~]# ./poc
    5905
    [root@localhost ~]# ./poc
    2225
    [root@localhost ~]# ./poc
    2465
    [root@localhost ~]# ./poc
    6017
    [root@localhost ~]# ./poc
    8657
    [root@localhost ~]# ./poc
    8401
    [root@localhost ~]# ./poc
    5073
    [root@localhost ~]# ./poc
    5505
    [root@localhost ~]# ./poc
    1761
    [root@localhost ~]# ./poc
    8609
    [root@localhost ~]# ./poc
    3665
    [root@localhost ~]# ./poc
    3633
    [root@localhost ~]# ./poc
    6257
    [root@localhost ~]# ./poc
    3441
    [root@localhost ~]# ./poc
    4961
    [root@localhost ~]# ./poc
    5233
    [root@localhost ~]# ./poc
    561
    [root@localhost ~]# ./poc
    3441
    [root@localhost ~]# ./poc
    2097
    [root@localhost ~]# ./poc
    1729
    [root@localhost ~]# ./poc
    1841
    [root@localhost ~]# ./poc
    2241
    [root@localhost ~]# ./poc
    2145
    [root@localhost ~]# ./poc
    6593
    [root@localhost ~]# ./poc
    5681
    [root@localhost ~]# ./poc
    737
    [root@localhost ~]# ./poc
    8353
    [root@localhost ~]# ./poc
    1937
    [root@localhost ~]# ./poc
    3937
    [root@localhost ~]# ./poc
    4769
    [root@localhost ~]# ./poc
    3441
    [root@localhost ~]# ./poc
    6097
    [root@localhost ~]# ./poc
    6673
    [root@localhost ~]# ./poc
    1857
    [root@localhost ~]# ./poc
    5617
    [root@localhost ~]# ./poc
    5473
    [root@localhost ~]# ./poc
    7313
    [root@localhost ~]# ./poc
    3921
    [root@localhost ~]# ./poc
    2369
    [root@localhost ~]# ./poc
    4609
    [root@localhost ~]# ./poc
    5569
    [root@localhost ~]# ./poc
    6209
    [root@localhost ~]# ./poc
    3457
    [root@localhost ~]# ./poc
    3665
    [root@localhost ~]# ./poc
    3297
    [root@localhost ~]# ./poc
    4465
    [root@localhost ~]# ./poc
    5281
    [root@localhost ~]# ./poc
    6017
    [root@localhost ~]# ./poc
    2705
    [root@localhost ~]# ./poc
    1601
    [root@localhost ~]# ./poc
    7457
    [root@localhost ~]# ./poc
    4145
    [root@localhost ~]# ./poc
    2353
    [root@localhost ~]# ./poc
    5537
    [root@localhost ~]# ./poc
    7873
    [root@localhost ~]# ./poc
    6449
    [root@localhost ~]# ./poc
    3297