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

标签 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 权限(执行)。但是非初始化变量、初始化变量、全局变量和局部变量呢?它们属于哪个段,为什么?

最佳答案

局部变量无处可去。然而。当函数框架激活时,它们将在堆栈上。

常量数据肯定在某处标记为“r”但不是“w”或“x”。

初始化数据被标记为“rw”而不是“x”。非初始化数据可能也有:其实.data(已初始化)和.bss(未初始化)是一样的,只是.bss在可执行镜像中不占用空间(它被加载程序初始化为零).

关于c -/proc/self/映射到实际代码的段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24623328/

相关文章:

c++ - 在 Linux 上使用 Qt 连接到 Azure SQL Server

linux - 如何杀死一个 shell 脚本和它创建的进程?

linux - 使用 shell 或 bash 脚本根据目录名称删除多个目录的脚本

c - 在没有for的情况下向左旋转C中的数组?

c - 是否允许变量数组参数作为函数外的索引变量?

c++ - 多边形中的内部点

c - 快速覆盖 -Werror 标志的方法?

c++ - 如何创建接受参数的dll

c - 为什么编译的时候会出现如下错误

iframe - YouTube Iframe代码不再显示CC