C语言程序的文件格式

今天在一篇文章看到以下信息,讲解关于ELF文件格式的内容,觉得有必要记录下来以备查阅:

const常量, 字符串字面值都是位于.rodata段, 在链接时.rodata段与.text段合并到Text Segment中, 在加载运行时操作系统把Text Segment的页面只读保护起来, 防止意外改写.

  • 操作系统的内存管理与编译器的语义检查为全局const变量提供了双重保护.
  • 函数的局部变量在栈上分配, 如果把局部变量声明为const就少了一层保护, 操作系统无法对栈看见只读保护(因为栈上的其他数据要求可读可写)

编译器会给函数中的static变量的符号名加一个后缀, 比如a会变成a.1706(某种程度上, 跟C++的重载函数的处理差不多)

.bss段与.data段的不同之处在于, .bss断在文件中不占存储空间, 加载到内存时这个段用0填充.
C语言规定全局变量和static变量(不管是函数里还是函数外)如果不初始化初值都为0, 未初始化的和明确初始化为0的全局变量,static变量都会分配在bss段.

[bss是历史遗留下来的名词, 全称是"Block Started by Symbol", 最初是IBM 704汇编器的一条伪指令名字, 沿用至今. 不过你也可以记成"Better Save Space", 因为.bss段在文件中不占存储空间]

虽然栈是从高地址向低地址增长的,但是数组跟结构体都是从低地址向高地址排列.


原文地址:

Linux C一站式编程答案



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值