C++:虚拟地址空间、编译链接过程

1.虚拟地址空间:

        在Linux下的虚拟地址空间中,用户空间、内核空间以3:1划分,即3G大小的用户空间和1G大小的内核空间,具体各区域划分如图:

小补充:思考全局变量与局部变量各自存储在什么段?

#include<iostream>

int gdata1=10;//.data
int gdata2=0;//.bss
int gdata3;//.bss

int main()
{
   int ldata1=30;//.text
   int ldata2=0;//.text
   int ldata3;//.text
   static int ldata4=40;//.data
   static int ldata5=0;//.bss
   static int ldata6;//.bss
   return 0;
}

规则如下:

.data段存放 已初始化且初始化不为0的数据

.bss 段存放 未初始化或初始化为0的数据 

.text 段存档代码段

 

 

2.编译连接过程:从源文件.cpp编译链接到.exe,需要经历如下步骤:

 

各个阶段所需要完成的工作: 

 

一、预编译:主要处理那些源文件中的以“#”开始的预编译指令。比如“#include”、“#define”等,具体处理规则如下:

    1.对“#define”删除,并展开所有的宏定义;

    2.处理所有条件预编译指令,比如“#if” 、“#endif”,“else”等;

    3.处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;

    4.删除所有的注释,比如“//”、“/* */”;

    5.添加行号的文件标识名;

    6. 保留所有#pragma与仪器指令。

二、编译:将预处理完的文件进行一系列词法分析、语法分析、语义分析、优化后生成的相应汇编代码文件

三、汇编:将汇编代码转变成机器可以执行的指令,即翻译成二进制

四、链接:

    1.合并段和符号表

    2.符号分析

    3.分配地址和空间 

    4.符号的重定位

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值