全局变量,静态变量以及局部变量存放位置
来源:互联网 发布:天刀捏脸数据女明月心 编辑:程序博客网 时间:2024/06/01 10:44
今天开始看《程序员的自我修养:链接、装载与库》,对ELF文件格式内容进行一下总结,主要分析全局变量,静态变量以及局部变量存放位置。
ELF文件有很多种:可重定位文件(如静态库),可执行文件,共享文件(动态库),核心转储文件(Core dump file)。
ELF文件主要有以下段:
file header
.text section
.data section
.bss section
这里主要分析以下每个字段的内容。
file header字段里存放了描述整个文件的基本属性信息的内容,如程序入口地址,其他各段信息(偏移量和范围)
.text section:主要是编译后的源码指令,是只读字段。
.data section :初始化后的非const的全局变量变量或者局部static变量。
.bss:未初始化后的非const全局变量和局部static变量。
另外,还有一些其他字段:如.rodata字段和.comment字段分别存放只读数据和注释部分。
用书上提供的例子做测试:
#include <stdio.h>
int global_init_val = 84;//.data
int global_uninit_val;
char b[]="aaa";//.data
char c[]="dddd";//.data
const char e[]="yyyy";//g++:not found gcc:.rodata
const int a = 0x555555;//g++:not found gcc:.rodata
void func1(int i)
{
char * a ="abab";//.rodata
const char c[] = "eeee";//.text(len >3)
char b[] = "ddd";//.rodata(len <=3)
char d[] = "xxxx";//.text(>3 ?)
printf("%d/n",i);
}
int main()
{
static int static_var = 85;//.data
static int static_var2;
int a = 1;
int b;
func1(static_var+static_var2 + a+b);
return a;
}
经过objdump测试.o文件:
所有的初始化后的非const的全局变量变量或者局部static变量都放在.data段
而在g++下:
const的全局变量或者static变量则不可见(猜想可能是编译时作为优化存放在寄存器中?)
在gcc下:
const的全局变量或者static变量存放在.rodata和.text中,都是作为只读变量来存放的。
- 全局变量,静态变量以及局部变量存放位置
- 全局变量,静态变量以及局部变量存放位置
- 全局变量,静态变量以及局部变量存放位置
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别
- 局部变量,静态局部变量,全局变量,静态全局变量在内存中的存放区别(转)
- 局部变量、全局变量、静态变量的含义及存储位置
- 局部变量、全局变量、静态变量
- 局部变量, 全局变量, 静态变量
- 局部变量、全局变量、静态变量
- 静态变量,局部变量,全局变量
- 局部变量、全局变量、静态变量
- Chit chat 闲聊
- [英语阅读]研究:负面情绪也有益处
- November, 03
- 寒潮 cold snap
- Visual C++ 6.0 快捷键
- 全局变量,静态变量以及局部变量存放位置
- oracle中归档模式与非归档模式之间的转换
- 插入排序
- [转]简洁、明晰!数据库设计三大范式应用实例剖析
- oracle的归档模式
- 不使用DLL创建全局系统钩子
- 将LINUX的控制台定向到串口终端
- ZFS文件系统将内置Deduplication
- IIS的ftp权限设置和远程桌面的一个小问题