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

时间:2013-05-15 01:35:21

标签: linux memory fedora

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

  1. 为什么fooargv[0]之间的距离总是不同?
  2. 为什么不与4对齐?虽然预期结果是4的倍数而不是
  3. 我想知道奇怪的外表的详细原因。

    我知道它与ASLR

    无关
    [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
    

1 个答案:

答案 0 :(得分:0)

<强> 1。为什么foo和argv [0]之间的距离总是不同?

因为ASLR。

  

我知道这与ASLR无关

你确定吗?你的内核的虚拟地址空间随机化参数值(randomize_va_space)是什么?它应该是0。

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

你想用什么证明?您的代码计算从 argv 中的第一个字符串到本地变量 foo 的距离。这是什么意思?

&amp;处理参数和局部变量的实际上是OS和编译器相关的。请查看以下帖子:Where are C/C++ main functions parameters