19. 程序在编译过程中编译和链接各做了哪些工作? 编译连接后内存怎么分段,各段内存有哪些特点?

在程序的编译和链接过程中,编译器和链接器分别负责不同的工作。编译阶段的主要工作由编译器完成:词法分析和语法分析:将源代码分解为词法单元,并根据语法规则构建抽象语法树。语义分析:检查类型匹配、变量声明等语义错误。中间代码生成:生成中间表示的代码,如汇编代码或机器码。链接阶段的主要工作由链接器完成:符号解析:解析所有的符号引用,并将其与定义进行关联。地址重定位:将各个目标文件中的相对地址转换为绝对地址。符号重命名:对重复定义的符号进行重命名以避免冲突。生成可执行文件:将处理后的目标文件及库文件合并成最终的可执行文件。在链接后,内存会被分为以下几个段(或区域):代码段(Text Segment):存放程序的机器指令,即可执行的程序代码。通常是只读的,保护代码不被修改。在运行时,代码段的指令按顺序执行,实现程序的功能。数据段(Data Segment):存放全局变量、静态变量和常量等数据。可以被修改,但其大小在程序运行期间保持不变。BSS段(Block Started by Symbol Segment):存放未初始化的全局变量和静态变量。通常占用的是零值内存,不需要存储实际数据。在程序加载时,BSS段会初始化为零值。堆(Heap):动态分配的内存区域。通过动态内存分配函数(如malloc、free)进行管理。大小可以在运行时根据需要动态调整。栈(Stack):存放函数调用的临时变量、局部变量、函数参数等。遵循“先进后出”的原则,用于控制函数调用和返回。栈的大小在编译阶段就确定了,按照一定的规则进行分配。这些内存段具有不同的特点和使用方式,对应着不同的内存区域,它们在程序运行过程中扮演了不同的角色。

发表评论