当前位置: 首页 > news >正文

从源程序到可执行文件的四个过程

从源程序到可执行文件的四个过程

  • 预处理
  • 编译
  • 汇编
  • 链接

程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接,如下图所示:
在这里插入图片描述

  1. -E选项:提示编译器执行完预处理就停下来,后边的编译、汇编、链接就先不执行了。
  2. -S选项:提示编译器执行完编译就停下来,不去执行汇编和链接了。
  3. -c选项:提示编译器执行完汇编就停下来。
  4. -o选项:生成可执行文件。

预处理

预处理之后的文件仍然是一个C++文件,预处理过程进行的操作如下:

  • 将所有的“#define”删除,并且展开所有的宏定义
  • 处理所有的条件编译指令,比如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”
  • 处理“#include”指令,将被包含的头文件插入到该指令的位置。(这个过程是递归进行的,因为被包含的文件可能还包含了其他文件)
  • 删除所有的注释“//”和“/* */”。
  • 添加行号。

编译

编译过程主要包括词法分析、语法分析、语义分析等操作。编译完成后生成一个 .s 文件,即汇编文件

词法分析
词法分析是使用一种叫做 lex 的程序实现词法扫描,它会按照用户之前描述好的词法规则将输入的字符串分割成一个个记号。产生的记号一般分为:关键字、标识符、字面量(包含数字、字符串等)和特殊符号(运算符、等号等),然后他们放到对应的表中。

语法分析
语法分析器根据用户给定的语法规则,将词法分析产生的记号序列进行解析,然后将它们构成一棵语法树。对于不同的语言,只是其语法规则不一样。

语义分析
语法分析完成了对表达式语法层面的分析,但是它不了解这个语句是否真正有意义。有的语句在语法上是合法的,但是却是没有实际的意义,比如说两个指针的做乘法运算,这个时候就需要进行语义分析,但是编译器能分析的语义也只有静态语义。

  • 静态语义:在编译期就可以确定的语义。通常包括声明与类型的匹配、类型的转换。比如当一个浮点型的表达式赋值给一个整型的表达式时,其中隐含一个从浮点型到整型的转换,而语义分析就需要完成这个转换,再比如,将一个浮点型的表达式赋值给一个指针,这肯定是不行的,语义分析的时候就会发现两者类型不匹配,编译器就会报错。

  • 动态语义:只有在运行期才能确定的语义。比如说两个整数做除法,语法上没问题,类型也匹配,听着好像没毛病,但是,如果除数是0的话,这就有问题了,而这个问题事先是不知道的,只有在运行的时候才能发现他是有问题的,这就是动态语义。

汇编

汇编对应生成的文件是目标文件,目标文件由机器码写成。

链接

目标文件经过链接可以形成一个可执行文件。链接过程主要包括了符号决议和重定位。

符号决议
有时候也被叫做符号绑定、名称绑定、名称决议、或者地址绑定,其实就是指用符号来去标识一个地址。比如说 int a = 6,这样一句代码,用a来标识一个块4个字节大小的空间,空间里边存放的内容就是6。

重定位
重新计算各个目标的地址过程叫做重定位,重定位分为以下两步:

  1. 合并相同类型的节,然后链接器将运行时的内存地址赋给新的聚合节。这一步完成,程序中的每条指令和全局变量都有唯一的运行时内存地址了。
  2. 链接器修改代码节和数据节中对于每个符号的引用,使得他们指向正确的运行时地址。

相关文章:

从源程序到可执行文件的四个过程

从源程序到可执行文件的四个过程 预处理编译汇编链接 程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接,如下图所示: -E选项:提示编译器执行完预处理就停下来,后边的编译、汇编、链接就先不执…...

C++部署学习

gcc -E src/main.c -o src/main.i gcc -S src/main.c -o src/main.s gcc -C src/main.c -o src/main.o gcc src/main.c -o exec ./exec...

linux下lazarus开发ide里 BGRAControls控件库comboBox示例

下载开发工具 ftp://ftp.freepascal.org/pub/lazarus/releases/Lazarus%20Linux%20amd64%20DEB/Lazarus%202.2.6/https://sourceforge.net/projects/lazarus/files/Lazarus%20Linux%20amd64%20DEB/Lazarus%202.2.6/ sourceforge下载可能比较慢,选择 下载有问题&…...

Redis学习路线(9)—— Redis的场景使用

默认做好了其它的前提,只专注于Redis使用 一、短信登录 在没有Redis数据库时,我们会基于Session实现登录(利用令牌进行授权),是怎么实现的呢? (一)基于Session的短信登录功能 1、…...

糟了,数据库主从延迟了!

前言 在实际的生产环境中,由单台MySQL作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面 因此,一般来说都是通过集群主从复制(Master-Slave)的方式来同步数据&…...

VUE,子组件给父组件传递参数,props 自定义属性,ref

<template><div><!-- 子传父 --><!-- 通过父组件给子组件传递函数类型的props实现&#xff1a;子给父传递数据 --><AA :getAAname"getAAname"/><h1>AA&#xff1a;{{aaname}}</h1><!-- 通过父组件给子组件绑定一个自定…...

【Oracle系列】- Oracle数据迁移

【Oracle系列】- Oracle数据迁移 文章目录 【Oracle系列】- Oracle数据迁移一、概述二、数据迁移方案三、模拟迁移方案四、迁移步骤五、迁移方案及其实施细则5.1 exp/imp逻辑备份与恢复5.2 Storage存储迁移5.3 利用data guard迁移 一、概述 最近在做公司软件系统盘点时&#x…...

Linux环境安装MySQL(详细教程)

1、下载MySQL MySQL官网&#xff1a;MySQLhttps://www.mysql.com/ 下载社区版&#xff08;免费&#xff0c;但不提供技术支持&#xff09; 简单说明一下rpm和tar包的区别&#xff1a; tar 只是一种压缩文件格式&#xff0c;所以&#xff0c;它只是把文件压缩打包 rpm&#xf…...

23. Mysql中的排序规则

文章目录 Mysql中的排序规则1. 数据库默认的排序规则2. 查看表的排序规则2.1 查看表排序规则2.2 查看字段排序规则 3.修改排序规则3.1 修改库3.2 修改表3.3 修改字段 Mysql中的排序规则 1. 数据库默认的排序规则 mysql8的默认排序方式是 utf8mb4_0900_ai_ci mysql5的默认排序…...

MongoDB 基础学习记录

MongoDB 基础 mongoDB 是由 C语言编写,基于分布式文件存储的开源数据库系统,是一个 nosql 数据库. 在高负载的情况下,添加更多的节点,保证服务器性能,MongoDB 旨在为 web 引用提供可扩展的高性能存储解决方案,将数据存储为给文档, 数据结构由键值(key,value)对组成,MongoDB 文…...

Visual Studio2022报错 无法打开 源 文件 “openssl/conf.h“解决方式

目录 问题起因问题解决临时解决方案 问题起因 近一段时间有了解到Boost 1.82.0新添加了MySQL库&#xff0c;最近一直蠢蠢欲动想要试一下这个库 所以就下载了源码并进行了编译&#xff08;过程比较简单&#xff0c;有文档的&#xff09; 然后在VS2022中引入了Boost环境&#xf…...

【更新公告】Airtest更新至1.3.0.1版本

1. 前言 本次更新为Airtest库更新&#xff0c;版本提升至1.3.0.1版本&#xff0c;主要新增了一些iOS设备相关的装包等接口&#xff0c;以及封装了一些tidevice常用接口。更多更新详情&#xff0c;详见我们下文的描述。 2. 新增iOS设备接口 1&#xff09;iOS安装接口&#xf…...

SQL语句集锦

题记&#xff1a;SQL语句就是一种编程语言&#xff0c;我们平时项目中我们需要从数据库种调取数据&#xff0c;然后通过增删改查的接口对数据库进行操作&#xff0c;当然我们也可以用数据库自己的编程语言进行数据库里边数据的操作。 1.select * from users&#xff1b; 从use…...

【多线程中的线程安全问题】线程互斥

1 &#x1f351;线程间的互斥相关背景概念&#x1f351; 先来看看一些基本概念&#xff1a; 1️⃣临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。2️⃣临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。3️⃣互斥&…...

抖音seo短视频矩阵系统源代码开发技术分享

抖音SEO短视频矩阵系统是一种通过优化技术&#xff0c;提高在抖音平台上视频的排名和曝光率的系统。以下是开发该系统的技术分享&#xff1a; 熟悉抖音平台的算法 抖音平台的算法是通过分析用户的兴趣爱好和行为习惯&#xff0c;对视频进行排序和推荐。因此&#xff0c;开发人员…...

flutter实战(01)windows桌面版 修改应用logo、名称、显示位置、显示大小

说明&#xff1a;该系列文章主要为flutter在windows桌面平台实战中遇到的一些坑。 1 修改logo 只需要在flutter项目/windows/runner/resources目录下替换原来的应用图标 app_icon.ico即可。 2 修改应用名称、显示位置、显示大小 修改flutter项目/windows/runner/main.cpp 文…...

校园基础设施资源管理

背景 自2017年起&#xff0c;为响应两会提出的“数实融合”“数字经济”“数字中国”的中国经济发展新动向&#xff0c;满足“中国教育现代化2030”战略部署&#xff0c;进一步推动“教育信息化十三五规划”的落实。这五年时间&#xff0c;各大高校致力于深化信息技术与教育教…...

Github git clone 和 git push 特别慢的解决办法

1.在本地上使用 SSH 命令无法git push 上传 github 项目 2.使用 git clone 下载项目特别慢总是加载不了 解决办法1 将 *** 的连接模式换成&#xff1a;D-i-r-e-c-t&#xff08;好像不太有用&#xff09; 后面再找找能不能再G-l-o-b-a-l 下解决该问题 解决办法 2 mac下直接设…...

【计网】TCP在可靠传输中都干了啥

文章目录 1、概述2、校验和3、序列号和确认应答机制4、重传机制4.1、介绍4.2、超时重传4.3、快速重传 5、滑动窗口协议5.1、介绍5.2、发送方的滑动窗口5.3、接收方的滑动窗口 6、流量控制7、拥塞控制7.1、介绍7.2、慢开始7.3、拥塞避免7.4、快重传和快恢复 1、概述 TCP 是面向…...

windows下载安装FFmpeg

FFmpeg是一款强大的音视频处理软件&#xff0c;下面介绍如何在windows下下载安装FFmpeg 下载 进入官网: https://ffmpeg.org/download.html, 选择Windows, 然后选择"Windows builds from gyan.dev" 在弹出的界面中找到release builds, 然后选择一个版本&#xff0…...

一键部署雪女-斗罗大陆-造相Z-Turbo:小白也能轻松生成动漫女神

一键部署雪女-斗罗大陆-造相Z-Turbo&#xff1a;小白也能轻松生成动漫女神 1. 镜像简介与核心功能 1.1 什么是雪女-斗罗大陆-造相Z-Turbo 雪女-斗罗大陆-造相Z-Turbo是一款基于Xinference部署的文生图AI模型服务&#xff0c;专门用于生成斗罗大陆中雪女角色的高质量动漫图像…...

Pixel Couplet Gen效果展示:抽象门神像素方块+动态卷轴交互演示

Pixel Couplet Gen效果展示&#xff1a;抽象门神像素方块动态卷轴交互演示 1. 项目概览 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。通过ModelScope大模型驱动&#xff0c;将传统春联创作转化为充满游戏感的数字体验。 核心特点&#xff1a…...

Kandinsky-5.0-I2V-Lite-5s企业应用:HR招聘海报→候选人互动式动态介绍视频生成

Kandinsky-5.0-I2V-Lite-5s企业应用&#xff1a;HR招聘海报→候选人互动式动态介绍视频生成 1. 引言&#xff1a;让招聘海报"活"起来 想象一下这样的场景&#xff1a;你的HR团队精心设计了一份招聘海报&#xff0c;但投递量却不如预期。问题可能出在传统静态海报难…...

Python偏函数partial的用法小结

functools.partial(func, /, *args, **keywords) 会返回一个新可调用对象&#xff0c;它把原函数 func 的部分位置参数和/或关键字参数“预先绑定”。 这样你就能得到一个“定制版”的函数&#xff0c;后续只需要补齐剩余参数即可调用。返回对象类型是 functools.partial 实例&…...

Qwen3.5-4B-Claude-Opus保姆级教程:Web端UI功能分区与高级参数联动说明

Qwen3.5-4B-Claude-Opus保姆级教程&#xff1a;Web端UI功能分区与高级参数联动说明 1. 模型与平台介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型&#xff0c;重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能…...

WSL2下USB串口设备‘失踪’?手把手教你找回/dev/ttyUSB0(以Quectel模块为例)

WSL2下USB串口设备消失的终极解决方案&#xff1a;从原理到实战 最近在WSL2环境下调试Quectel模块时&#xff0c;发现一个奇怪现象&#xff1a;lsusb明明能识别设备&#xff0c;但/dev/ttyUSB0却神秘失踪。这让我想起去年调试树莓派时遇到的类似问题&#xff0c;但WSL2的环境特…...

Qwen3.5-2B效果展示:儿童绘本图→识别角色/场景/情绪→生成故事续写+朗读脚本

Qwen3.5-2B效果展示&#xff1a;儿童绘本图→识别角色/场景/情绪→生成故事续写朗读脚本 1. 模型介绍 Qwen3.5-2B是通义千问团队推出的轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本&#xff08;20亿参数&#xff09;。这个模型特别适合在资源有限的设备上部…...

Intv_AI_MK11嵌入式开发实战:在WSL2中部署AI模型并集成Keil5

Intv_AI_MK11嵌入式开发实战&#xff1a;在WSL2中部署AI模型并集成Keil5 1. 为什么选择WSL2进行嵌入式AI开发 对于嵌入式开发者来说&#xff0c;传统AI模型开发面临一个典型困境&#xff1a;训练环境通常基于Linux系统&#xff0c;而嵌入式开发工具链&#xff08;如Keil MDK&…...

从预测到归因:手把手教你用因果森林(grf)做特征重要性分析与亚组发现

从预测到归因&#xff1a;手把手教你用因果森林&#xff08;grf&#xff09;做特征重要性分析与亚组发现 在金融风控、个性化营销和医疗疗效评估等领域&#xff0c;我们常常面临一个关键问题&#xff1a;干预措施的效果是否存在显著差异&#xff1f;传统分析方法如A/B测试能告诉…...

重构PDF知识管理:Obsidian PDF++让文献处理效率提升300%的实战指南

重构PDF知识管理&#xff1a;Obsidian PDF让文献处理效率提升300%的实战指南 【免费下载链接】obsidian-pdf-plus PDF: the most Obsidian-native PDF annotation & viewing tool ever. Comes with optional Vim keybindings. 项目地址: https://gitcode.com/gh_mirrors/…...