Linux程序存储结构

Linux可执行文件结构

在Linux系统下,程序是一个普通可执行文件,以下列出一个Linux下ELF格式可执行文件的基本情况
可以看出,此ELF格式可执行文件在存储时(没有调入内存)分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。各段基本内容说明如下:

  1. 代码区(text segment)。存放CPU执行的机器指令(machine instructions)。通常,代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。因此,常量数据在编译时在代码段中分配空间。代码区的指令包括操作码和操作对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码段中;如果是局部数据,将在运行时在栈区分配空间,然后再引用该数据的地址;如果是BSS区和数据区,在代码中同样引用该数据的地址。
  2. 全局初始化数据区/静态数据区(initialized data segment/data segment)。或简称数据段,该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)。但被const声明的变量以及字符串常量在代码段中申请空间。例如,一个不在任何函数体内的定义(全局数据)如下:int maxcount =99;使得变量maxcount根据其初始值被存储到初始化数据区中。在任意位置定义静态变量的方式如下:static mincount=100;这定义了一个静态变量并初始化,如果是在任何函数体外定义,则表示其为一个全局静态变量,如果在函数体内(局部),则表示其为一个局部静态变量。需要提及的是,如果在函数名前加上static,则表示此函数只能在当前文件中被调用。
  3. 未初始化数据区。亦称BSS(Block Started by Symbol),存入的是未初始化全局变量和未初始化静态变量。BSS区的数据在程序开始执行之前被内核初始化为0或者空指针(NULL)。例如一个在函数体外定义,未初始化变量:long sum[1000];//将变量sum存储到未初始化数据区
    另:局部变量动态地在栈中申请。
    在这里插入图片描述
    代码段地数据增加了15个字节,分别是4字节的const i 和11个字节的字符串“helloworld”。
    来源:《Linux高级程序设计》人民邮电出版社 杨宗徳 吕光宏 刘雍 编著
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值