Linux应用程序地址布局

来源:互联网 发布:水镜先生知乎 编辑:程序博客网 时间:2024/06/06 02:51
一、程序构成
在学习Linux应用程序开发时,经常会遇到如下概念:代码段、数据段、BSS段(Block Started by Symbol,又名:未初始化数据段) 、堆(heap)和栈(stack)。而这些部分也是构成Linux应用程序的重要组成部分。

二、内存布局
1.从低地址到高地址分别为代码段、数据段、BSS段、堆、栈
2.堆向高内存地址生长
3.栈向低内存地址生长


三、数据存放
1.代码段:代码,全局常量(const)、字符串常量
2.数据段:全局变量(初始化以及未初始化的)、静态变量(全局的和局部的、初始化的以及未初始化的)
3.堆:动态分配的区域
4.栈:局部变量(初始化以及未初始化的,但不包含静态变量)、局部只读变量(const)
addr.c:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int global_init_a=1;    //全局的,初始化的变量 -> 数据段
  4. int global_uninit_a;    //全局的,没有初始化的变量 -> 数据段
  5. static int static_global_init_a=1;    //全局的,静态的,初始化的变量 -> 数据段
  6. static int static_global_uninit_a;    //全局的,静态的,未初始化的变量 -> 数据段
  7. const int const_global_a=1;    //全局的,常量 -> 代码段

  8. int global_init_b=1;    //全局的,初始化的变量 -> 数据段
  9. int global_uninit_b;    //全局的,没有初始化的变量 -> 数据段
  10. static int static_global_init_b=1;    //全局的,静态的,初始化的变量 -> 数据段
  11. static int static_global_uninit_b;    //全局的,静态的,未初始化的变量 -> 数据段
  12. const int const_global_b=1;    //全局的,常量 -> 代码段

  13. int main()
  14. {
  15.     int local_init_a=1;    //局部,初始化的 ->
  16.     int local_uninit_a;    //局部,未初始化的 ->
  17.     static int static_local_init_a=1;    //局部,静态,初始化 -> 数据段
  18.     static int static_local_uninit_a;    //局部,静态,未初始化 -> 数据段
  19.     const int const_local_a=1;    //局部的,常量 ->

  20.     int local_init_b=1;    //局部,初始化的 ->
  21.     int local_uninit_b;    //局部,未初始化的 ->
  22.     static int static_local_init_b=1;    //局部,静态,初始化 -> 数据段
  23.     static int static_local_uninit_b;    //局部,静态,未初始化 -> 数据段
  24.     const int const_local_b=1;    //局部,常量 ->

  25.     int *malloc_p_a;
  26.     malloc_p_a=malloc(sizeof(int));    //通过malloc分配得到的,局部 ->

  27.     printf("&global_init_a=%p, global_init_a=%d\n", &global_init_a,global_init_a);
  28.     printf("&global_uninit_a=%p, global_uninit_a=%d\n", &global_uninit_a,global_uninit_a);
  29.     printf("&static_global_init_a=%p, static_global_init_a=%d\n", &static_global_init_a,static_global_init_a);
  30.     printf("&static_global_uninit_a=%p, static_global_uninit_a=%d\n", &static_global_uninit_a,static_global_uninit_a);
  31.     printf("&const_global_a=%p, const_global_a=%d\n", &const_global_a,const_global_a);

  32.     printf("&global_init_b=%p, global_init_b=%d\n", &global_init_b,global_init_b);
  33.     printf("&global_uninit_b=%p, global_uninit_b=%d\n", &global_uninit_b,global_uninit_b);
  34.     printf("&static_global_init_b=%p, static_global_init_b=%d\n", &static_global_init_b,static_global_init_b);
  35.     printf("&static_global_uninit_b=%p, static_global_uninit_b=%d\n", &static_global_uninit_b,static_global_uninit_b);
  36.     printf("&const_global_b=%p, const_global_b=%d\n", &const_global_b,const_global_b);

  37.     printf("&local_init_a=%p, local_init_a=%d\n", &local_init_a,local_init_a);
  38.     printf("&local_uninit_a=%p, local_uninit_a=%d\n", &local_uninit_a,local_uninit_a);
  39.     printf("&static_local_init_a=%p, static_local_init_a=%d\n", &static_local_init_a,static_local_init_a);
  40.     printf("&static_local_uninit_a=%p, static_local_uninit_a=%d\n", &static_local_uninit_a,static_local_uninit_a);
  41.     printf("&const_local_a=%p, const_local_a=%d\n", &const_local_a,const_local_a);

  42.     printf("&local_init_b=%p, local_init_b=%d\n", &local_init_b,local_init_b);
  43.     printf("&local_uninit_b=%p, local_uninit_b=%d\n", &local_uninit_b,local_uninit_b);
  44.     printf("&static_local_init_b=%p, static_local_init_b=%d\n", &static_local_init_b,static_local_init_b);
  45.     printf("&static_local_uninit_b=%p, static_local_uninit_b=%d\n", &static_local_uninit_b,static_local_uninit_b);
  46.     printf("&const_local_b=%p, const_local_b=%d\n", &const_local_b,const_local_b);
  47.     
  48.     printf("malloc_p_a=%p, *malloc_p_a=%d\n",malloc_p_a,*malloc_p_a);

  49.     while(1);
  50.     return 0;
  51. }
此代码,用ps -aux看进程ID后,再用cat /proc/ID.../maps
通过printf打印的地址,和maps的地址对应。了解各个变量所处的位置。

四、利用readelf–S程序名分析BSS段
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(100) | 评论(0) | 转发(0) |
0

上一篇:GDB和coredump

下一篇:静态函数库、动态链接库设置

相关热门文章
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • 彻底搞定C语言指针详解-完整版...
给主人留下些什么吧!~~
原创粉丝点击