/ proc / self /映射到实际代码的段

时间:2014-07-08 03:42:50

标签: c linux cc

我得到关于列地址,权限,偏移量,设备等的理论......但是我还没有找到每个段与程序本身的关系,例如考虑以下映射:

08048000-08049000 r-xp 00000000 08:01 132351     /home/myuser/myprogram
08049000-0804a000 r--p 00000000 08:01 132351     /home/myuser/myprogram
0804a000-0804b000 rw-p 00001000 08:01 132351     /home/myuser/myprogram
0804b000-0804e000 rw-p 00000000 00:00 0
b751f000-b7520000 rw-p 00000000 00:00 0
..... more mapping starting with libc mapping

对于该计划:

int global_noini;       /* non-array non-initialized */
int global_ini=666;     /* non-array initialized */


int vec_global_noini[4000]; /* array non-initialized */

/* array_initialized */
int vec_global_ini[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};


int main(int argc, char **argv) {
    int local;              /* non-array local variable */
    int vec_local[2500];    /* array local variable */

    /* This function prints the map above */
    show_map();

    return 0;
}

我需要知道的是哪个部分是变量和原因。

到目前为止,我相信(如果我错了,请纠正我)代码本身位于第一段,因为它具有 x 权限(执行)。但是,那些非属性的,初始的,全局的和局部的变量呢?它们属于哪个部分以及为什么?

1 个答案:

答案 0 :(得分:2)

局部变量无处可去。然而。当功能框架变为活动状态时,它们将处于堆叠状态。

Const数据肯定被标记为" r"但不是" w"也不是" x"。

初始化的数据被标记为" rw"但不是" x"。非初始化数据也许也存在:事实上,.data(初始化)和.bss(非初始化)是相同的,除了.bss不占用可执行映像中的空间(它被加载器初始化为零) )。