C语言程序的文件格式

来源:互联网 发布:融合软件下载 编辑:程序博客网 时间:2024/05/21 00:18

今天在一篇文章看到以下信息,讲解关于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一站式编程答案



0 0
原创粉丝点击