C++_编译、链接原理及基础

基础知识点:

冯诺依曼体系:
                         计算机
运算器、控制器、内存、输入设备、输出设备
         CPU            内存                I/O
计算机识别:0、1代码
CPU识别:指令、数据
计算机32位、64位:计算机一次性能计算数据大小的宽度、ALU(算术逻辑单元)的宽度
 

操作系统:

虚拟地址与物理地址的映射:
由计算机内核实现、创建映射结构体、使用分段分页管理机制实现
映射以页为单位:一页大小为4k
1、创建PCB(虚拟地址空间和物理地址内存的映射结构体)
2、载入指令、数据
3、把第一行指令地址写入PC寄存器(下行指令寄存器)

linux 32位系统下虚拟地址空间分配:用户空间与内核空间之比为3:1(windows下为2:2)

.c/.cpp文件如何成为.exe被计算机识别?
阶段:源文件.c/.cpp --> 预编译 .i --> 编译.s --> 汇编.o --> 链接.exe
处理:预编译 .i            
                                   1、#define(宏)替换
                                    2、#include 递归展开头文件
                                    3、#if #endif #elif   
                                    4、删除注释
                                    5、添加行号、添加文本标识   
                                    6、保留#pragma
          编译 .s               编译以一个编译单元为单位(.c/.cpp文件)
                                    1、词法分析
                                    2、语法分析
                                    3、语义分析
                                    4、代码优化->指令代码          
          汇编 .o               指令代码翻译成二进制(汇编完成形成的.o文件为可重入的二进制文件,无地址,不可执行)
          链接 .exe           .exe文件为全局可见文件
                                    1、合并段、符号表
                                    2、符号解析:在符号引用地找到符号定义地
                                    3、分配地址空间
                                    4、符号重定位

          运行:
                                   1、建立虚拟地址空间和物理内存的映射(创建映射结构体),创建页目录,页表
                                    2、加载指令和数据
                                    3、入口地址写入下一行指令寄存器

 

linux下一切皆文件,linux下的可执行文件为ELF格式(Windows 为PE格式)

.data段:存放代码指令段
.data段:存放已初始化且初始化不为零的数据
.bss 段:存放未初始化或初始化为零的数据在文件中不存在,.bss段不占空间,但信息已被保存
局部变量为指令、全局变量、静态全局变量、静态局部变量为数据
当主函数调用其它函数后、调用函数与被调函数的ELF格式文件在合并时相同段与相同段进行合并

符号表的合并中    强弱符号(只考虑全局符号)
强符号:已初始化的全局变量
弱符号:未初始化的全局变量
强弱符号规则:
两强:重定义(不允许)
一强一弱:选强
两弱:选择占用空间较大的

 


                                         

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值