2 c++ 编译原理

预编译(.i)

1.删除#define 文本替换

2.处理#include 递归展开

3.处理#if #endif 等预编译指令

4.删除注释

5.添加行号和文件标识

6.保留#pragma

编译(.s)

1.词法分析

2.语法分析 一行表达式

3.语义分析 结合上下文

4.代码优化

5.生成汇编指令 低级语言

**汇编(.o)**目标文件 可重入的二进制文件

1.翻译指令 (把低级语言翻译为机器语言)

链接(.exe) 能运行 可执行文件

数据段(.data 和 .bss)存放数据的区别

1…data 已初始化且初始化不为0的数据

2…bss 未初始化或初始化为0的数据

#include<stdio.h>

int gdata1 = 10;//全局变量生成的都是数据 数据都在数据段存放 .data段
int gdatal = 0;//.bss段
int gdata3;//.bss段
static int gdata4 = 20;//静态的全局变量也是数据 .data段
static int gdata5 = 0;//.bss段
static int gdata6;//.bss段

int main()//函数名生成的是指令  .text段
{
    static int ldata = 30;//静态局部变量生成的也是数据 .data段
    static int ldata2 = 0;//.bss段
    static int ldata3;//.bss段
    
    int ldata4 = 40;//普通局部变量生成的是指令 .text段
    int ldata5 = 0;//.text段
    int ldata6;//.text段
    return 0;
}

问题1:汇编过程 int ldata = 20 是在text段,而不在stack区?

运行前 所有东西都在文件中

运行后 程序才在内存中 栈是内存区域

问题2:汇编后,文件中存在什么内容?

1.汇编阶段 bss少了4个字节 1个数据 少了那个数据 为什么?

​ gdata3在comment段

2.bss段不存在?为什么?信息从哪里来?REL布局

ELF

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

.o的布局,数据和指令存放的位置。指令数据生成的符号存放位置和属性

文件 虚拟地址空间映射 方便映射

文件标识 main.c

段信息 .text .data .bss

数据 gdata1 gdata3

函数 main()

 方便映射

文件标识 main.c

段信息 .text .data .bss

数据 gdata1 gdata3

函数 main()
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值