Linux应用程序地址布局
来源:互联网 发布:水镜先生知乎 编辑:程序博客网 时间:2024/06/06 02:51
一、程序构成
在学习Linux应用程序开发时,经常会遇到如下概念:代码段、数据段、BSS段(Block Started by Symbol,又名:未初始化数据段) 、堆(heap)和栈(stack)。而这些部分也是构成Linux应用程序的重要组成部分。
二、内存布局
1.从低地址到高地址分别为代码段、数据段、BSS段、堆、栈
在学习Linux应用程序开发时,经常会遇到如下概念:代码段、数据段、BSS段(Block Started by Symbol,又名:未初始化数据段) 、堆(heap)和栈(stack)。而这些部分也是构成Linux应用程序的重要组成部分。
二、内存布局
1.从低地址到高地址分别为代码段、数据段、BSS段、堆、栈
2.堆向高内存地址生长
3.栈向低内存地址生长
三、数据存放
三、数据存放
1.代码段:代码,全局常量(const)、字符串常量
2.数据段:全局变量(初始化以及未初始化的)、静态变量(全局的和局部的、初始化的以及未初始化的)
3.堆:动态分配的区域
4.栈:局部变量(初始化以及未初始化的,但不包含静态变量)、局部只读变量(const)
addr.c:
此代码,用ps -aux看进程ID后,再用cat /proc/ID.../maps
通过printf打印的地址,和maps的地址对应。了解各个变量所处的位置。
四、利用readelf–S程序名分析BSS段addr.c:
- #include <stdio.h>
- #include <stdlib.h>
- int global_init_a=1; //全局的,初始化的变量 -> 数据段
- int global_uninit_a; //全局的,没有初始化的变量 -> 数据段
- static int static_global_init_a=1; //全局的,静态的,初始化的变量 -> 数据段
- static int static_global_uninit_a; //全局的,静态的,未初始化的变量 -> 数据段
- const int const_global_a=1; //全局的,常量 -> 代码段
- int global_init_b=1; //全局的,初始化的变量 -> 数据段
- int global_uninit_b; //全局的,没有初始化的变量 -> 数据段
- static int static_global_init_b=1; //全局的,静态的,初始化的变量 -> 数据段
- static int static_global_uninit_b; //全局的,静态的,未初始化的变量 -> 数据段
- const int const_global_b=1; //全局的,常量 -> 代码段
- int main()
- {
- int local_init_a=1; //局部,初始化的 -> 栈
- int local_uninit_a; //局部,未初始化的 -> 栈
- static int static_local_init_a=1; //局部,静态,初始化 -> 数据段
- static int static_local_uninit_a; //局部,静态,未初始化 -> 数据段
- const int const_local_a=1; //局部的,常量 -> 栈
- int local_init_b=1; //局部,初始化的 -> 栈
- int local_uninit_b; //局部,未初始化的 -> 栈
- static int static_local_init_b=1; //局部,静态,初始化 -> 数据段
- static int static_local_uninit_b; //局部,静态,未初始化 -> 数据段
- const int const_local_b=1; //局部,常量 -> 栈
- int *malloc_p_a;
- malloc_p_a=malloc(sizeof(int)); //通过malloc分配得到的,局部 -> 堆
- printf("&global_init_a=%p, global_init_a=%d\n", &global_init_a,global_init_a);
- printf("&global_uninit_a=%p, global_uninit_a=%d\n", &global_uninit_a,global_uninit_a);
- printf("&static_global_init_a=%p, static_global_init_a=%d\n", &static_global_init_a,static_global_init_a);
- printf("&static_global_uninit_a=%p, static_global_uninit_a=%d\n", &static_global_uninit_a,static_global_uninit_a);
- printf("&const_global_a=%p, const_global_a=%d\n", &const_global_a,const_global_a);
- printf("&global_init_b=%p, global_init_b=%d\n", &global_init_b,global_init_b);
- printf("&global_uninit_b=%p, global_uninit_b=%d\n", &global_uninit_b,global_uninit_b);
- printf("&static_global_init_b=%p, static_global_init_b=%d\n", &static_global_init_b,static_global_init_b);
- printf("&static_global_uninit_b=%p, static_global_uninit_b=%d\n", &static_global_uninit_b,static_global_uninit_b);
- printf("&const_global_b=%p, const_global_b=%d\n", &const_global_b,const_global_b);
- printf("&local_init_a=%p, local_init_a=%d\n", &local_init_a,local_init_a);
- printf("&local_uninit_a=%p, local_uninit_a=%d\n", &local_uninit_a,local_uninit_a);
- printf("&static_local_init_a=%p, static_local_init_a=%d\n", &static_local_init_a,static_local_init_a);
- printf("&static_local_uninit_a=%p, static_local_uninit_a=%d\n", &static_local_uninit_a,static_local_uninit_a);
- printf("&const_local_a=%p, const_local_a=%d\n", &const_local_a,const_local_a);
- printf("&local_init_b=%p, local_init_b=%d\n", &local_init_b,local_init_b);
- printf("&local_uninit_b=%p, local_uninit_b=%d\n", &local_uninit_b,local_uninit_b);
- printf("&static_local_init_b=%p, static_local_init_b=%d\n", &static_local_init_b,static_local_init_b);
- printf("&static_local_uninit_b=%p, static_local_uninit_b=%d\n", &static_local_uninit_b,static_local_uninit_b);
- printf("&const_local_b=%p, const_local_b=%d\n", &const_local_b,const_local_b);
-
- printf("malloc_p_a=%p, *malloc_p_a=%d\n",malloc_p_a,*malloc_p_a);
- while(1);
- return 0;
- }
通过printf打印的地址,和maps的地址对应。了解各个变量所处的位置。
0
上一篇:GDB和coredump
下一篇:静态函数库、动态链接库设置
相关热门文章
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- 彻底搞定C语言指针详解-完整版...
给主人留下些什么吧!~~
评论热议
阅读全文
0 0
- Linux应用程序地址布局
- Linux应用程序地址布局
- linux应用程序地址布局
- Linux应用程序地址布局
- Linux应用程序地址布局
- Linux应用程序地址布局
- Linux应用程序地址布局
- [3]Linux应用程序地址布局
- [3]Linux应用程序地址布局
- 2、Linux应用程序地址布局
- linux应用程序(3)---应用程序地址布局
- Linux学习之Linux应用程序地址布局
- Linux应用程序在内存地址布局
- 一步一步学好Linux开发之Linux应用程序地址布局
- linux应用程序内存布局
- linux应用程序地址分布
- Linux应用程序地址分布
- linux应用编程笔记(3)addr.c分析linux应用程序地址布局
- 大学IT类社团主页
- LCD学习
- 触摸屏学习
- spring boot environmentaware接口实现环境变量读取和属性对象的绑定
- GDB和coredump
- Linux应用程序地址布局
- 静态函数库、动态链接库设置
- css技巧—图片配文字
- linux应用编程学习(6)信号
- 通过自定义属性添加样式(css+js,动态判断背景颜色)
- 信号量的互斥与同步
- 共享内存通信
- 消息队列编程
- 多线程互斥和同步
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
海扁王片尾曲
海布里之心
海川网泗洪论坛
海盗的幸福生活小游戏
海盗能源站
海底鱼叉男
海尔n87
海监111
海口蓝海阳光酒店
海拉尔好声音演唱会
海伦娜邦汉卡特
海门爱美阁美容
海门市爱美阁美容中心
海鸣威简介
海鸣威微博
海魔方团购
海宁宏洋集团有限责任公司
海派甜心14
海派甜心17
海派甜心吧
海派甜心百度影音
海平面升11厘米
海清北京快闪捞金
海清快闪捞金
海瑞斗严嵩主题曲
海瑟薇女装
海上放牧人
海蛇八卦牌属性
海獭千金
海堂薰恶魔化
海豚爱上猫结局
海信k770
海贼王qq皮肤
海之绮士团
海州区团委书记周
海州区团委书记周某
憨憨居居去买面
邯郸大学教室m l门
邯郸大学教室门视频
邯郸纠风网
邯郸骑友大本营