GCC编译器 gcc编译过程 ‘ ‘ ‘ ‘ --- 记一次查缺补漏 ‘ ‘

news2024/11/17 12:46:12

文章目录

  • 前言
  • GCC介绍
  • GCC编译过程
    • 预处理
    • 编译
    • 汇编
    • 链接
      • 关于链接:

前言

学习的过程遇到了.s后缀的文件,原来是gcc的编译过程,复习一下。
又牵扯到了各种C编译器,诸如MSVC、MinGW、Clang+LLVM等,挖个坑先。
还有关于动态链接和静态链接的知识,等等补。

GCC介绍

GCC编译器套装(GNU Compiler Collectin,缩写为GCC)是GNU计划制作的一种优化的编译器,支持各种编程语言、操作系统、计算机系统结构。
该编译器是以GPL及LGPL许可证所发行的自由软件,也是GUN计划的关键部分,还是GNU工具链的主要组成部分之一。 原名为GNU C语言编译器(GNU C Compiler)因为它原本只能处理C语言。如今GCC编译器已经被移植到比其他编译器更多的平台和指令架构上,并被广泛部署在开发自由和专有软件的工具中。
GCC还可以用于许多嵌入式系统,包括ARM和Power ISA的芯片。 GCC不仅是GNU操作系统得官方编译器,还是许多UNIX系统和Linux发行版的标准编译器。

GCC的设计:
GCC的外部接口遵循UNIX使用惯例。用户输入特定语言的驱动程序码(C语言为gcc,C++为g++,如此不一而足)该程序解释命令语句,调用实际编译器,在输出界面上运行汇编器,然后选择性地运行链接器,然后产生一个完整的可执行二进制文件。

GCC的扩展编译流程概览,包括专门的程序如预处理器、汇编器和链接器
在这里插入图片描述

GCC编译过程

如下图所示,从hello.c到hello(或a.out)文件,必须经历hello.i,hello.s,hello.out,最后才得到hello(或a.out)文件,分别对应着预处理、编译、汇编和链接4个步骤。
在这里插入图片描述
大致工作过程:
1.预处理(Preprocessing)
2.编译(Compilation),
3.汇编(Assemble),
4.链接(Linking)。

准备工作,先写一个C源代码:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;    // 这是一行注释
}

保存为hello.c

预处理

GCC编译的第一阶段是预处理(Preprocessing),在这个阶段,预处理器会对C/C++源代码进行一些操作,部分操作如下:

  • 移除注释
    预处理器会删除源代码中的注释,包括单行注释(//)和多行注释(/* … */).
  • 处理预处理指令
    预处理器会处理源代码中的预处理指令,这些指令以(#)开头,例如 #include、#define、#ifdef、#ifndef 等。其中,#include 指令用于包含头文件,#define 用于宏定义,#ifdef 和 #ifndef 用于条件编译等。
  • 宏展开
    预处理器会展开源代码中的宏,将宏调用替换成宏定义的内容。
  • 生成预处理后的代码文件
    预处理器的最终输出是一个去除了注释,展开了宏等操作的中间代码文件,通常以" .i "扩展名保存。这个文件可以用于接下来的编译步骤。

操作指令:

gcc -E hello.c -o hello.i

-E是预处理指令,-o是生成的文件名称

实际操作如下图:

在这里插入图片描述

将会得到一个hello.i文件,这是hello.c经过预处理后的文件,用vim打开hello.i观察

在这里插入图片描述

hello.c文件原来只有6行,经过预处理后增加到了七百多行,多了许多额外的变量、函数等内容,用G跳转到最下面可以发现,源代码部分 注释已经被删除。

在这里插入图片描述

编译

GCC 编译过程的第二阶段是编译(Compilation)。在这个阶段,编译器将经过预处理的源代码转换成汇编语言代码
在这个阶段,GCC会对经过预处理的源代码进行一些词法语法的分析,生成中间表示(介于源代码和目标代码之间的表达形式),并对源代码进行一定程度的优化,最后GCC将刚刚生成的中间表示转化成目标平台的汇编语言代码。也就是 .s 文件

在gcc编译参数上加-S 可以将hello.i编译成hello.s文件,
指令如下:

gcc -S hello.i

实际操作如下图:

在这里插入图片描述

hello.s是一个汇编文件,可以用Vim打开查看,如下图

在这里插入图片描述

汇编

GCC 编译过程的下一个阶段是汇编(Assembly),在这个阶段,编译器将中间表示(通常是汇编语言)转化为目标平台的机器码。

得到.s汇编文件后,就可以用gcc得到机器码了,命令如下:

gcc -c hello.s

实际操作如下:
在这里插入图片描述
生成了一个hello.o文件,这一步产生的文件叫做目标文件,是二进制格式。

链接

在 GCC 编译过程的链接(Linking)阶段,多个目标文件(通常是编译多个源文件生成的)以及库文件将被合并到一个可执行文件中。链接的主要任务是解析符号引用,将各个目标文件中的代码和数据段组合在一起,解决外部依赖关系,生成最终的可执行文件

命令如下:

gcc hello.o

这样会默认输出a.out文件,也可以用-o指定新的文件名,例如加上 -o hello,这样就会生成hello文件。
如下图:
在这里插入图片描述
执行一下:
在这里插入图片描述

关于链接:

链接分为动态链接和静态链接

动态链接使用动态链接库进行链接,生成的程序在执行时需要加载所需的动态库才能运行,动态链接生成的程序小巧,但是必须依赖动态库,否则无法执行。
linux下的动态链接库实际是共享目标文件(shared object),一般是.so文件,作用类似于windows下的.dll文件。
静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过体积较大。
linux下的静态库是汇编产生的.o文件的集合,一般以.a的文件形式出现,gcc默认是动态链接,加上-static参数则采用静态链接,

文献参考

https://www.cnblogs.com/wjchao/p/7460375.html
https://zhuanlan.zhihu.com/p/111500914

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1142524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大厂面试题-JVM为什么使用元空间替换了永久代?

目录 面试解析 问题答案 面试解析 我们都知道Java8以及以后的版本中&#xff0c;JVM运行时数据区的结构都在慢慢调整和优化。但实际上这些变化&#xff0c;对于业务开发的小伙伴来说&#xff0c;没有任何影响。 因此我可以说&#xff0c;99%的人都回答不出这个问题。 但是…

AI类APP上线需要注意的问题

上线AI类应用程序需要考虑一系列重要问题&#xff0c;以确保应用程序的顺利运行、用户满意度和法规遵从。以下是在上线AI应用程序时需要注意的关键问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。…

目标识别、目标追踪等计算机视觉技术在视频监控领域的应用

随着科技的不断进步和发展&#xff0c;人们的科技意识也在不断提高&#xff0c;人工智能技术也在逐渐改变着人类的生产和生活方式&#xff0c;尤其是在安防监控领域&#xff0c;人工智能技术的落地应用越来越多。 计算机视觉技术是指设备能够“看到”它正在进行的操作&#xf…

【python画画】蘑菇云爱心

来源于网上短视频 数学原理不懂&#xff0c;图个乐 import math from turtle import *def x(i):return 15 * math.sin(i) ** 3 * 20def y(i):return 20 * (12 * math.cos(i) - 5 * math.cos(2 * i) - 2 * math.cos(4 * i))speed(0) color(red) pensize(10) for i in range(51…

安全狗安装

安装waf 关闭apache程序及httpd.exe进程; 运行cmd&#xff0c;cd进入apache/bin文件夹目录&#xff0c; 执行httpd.exe -k install -n apache2.4.39; 启动apache,启动phpstudy 安全狗安装服务名称填写apache2.4.39; 安装安全狗之后就会提示报错 网站防护 可以设备黑白名单 漏…

ChatGLM系列六:基于知识库的问答

1、安装milvus 下载milvus-standalone-docker-compose.yml并保存为docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.3.2/milvus-standalone-docker-compose.yml -O docker-compose.yml运行milvus sudo docker-compose up -d2、文档预处理…

华为云1核2G2M带宽HECS云服务器价格和性能测评

华为云1核2G2M带宽HECS云服务器优惠价一年51元&#xff0c;高IO_40G系统盘&#xff0c;自带独立公网IP地址&#xff0c;可选北京、乌兰察布、上海和广州地域&#xff0c;华为云1核2G2M带宽服务器适用于小型网站、软件及应用。活动链接&#xff1a;atengyun.com/go/huawei 活动打…

在Win11上部署ChatGLM2-6B详细步骤--(下)开始部署

接上一章《在Win11上部署ChatGLM2-6B详细步骤--&#xff08;上&#xff09;准备工作》 这一节我们开始进行ChatGLM2-6B的部署 三&#xff1a;创建虚拟环境 1、找开cmd执行 conda create -n ChatGLM2-6B python3.8 2、激活ChatGLM2-6B conda activate ChatGLM2-6B 3、下载…

echarts将展示全天的数据,如一天的电费,一个停车场一天的饱和度等问题

项目场景&#xff1a; 我们的项目是通过ai识别停车场的停车数,来展示此停车场全天的饱和度,如下 问题描述 后台接口给的数据,就是这种,返回所有有停车数量的时间段,但是我们的x轴要求展示全天的数据,并且可伸缩刻度展示具体时间的停车情况 [{time:2023-10-27 08:20:20,carS…

vue的双向绑定的原理,和angular的对比

目录 前言 Vue的双向绑定用法 代码 Vue的双向绑定原理 Angular的双向绑定用法 代码 Angular的双向绑定原理 理解 图片 关于Vue的双向绑定原理和与Angular的对比&#xff0c;我们可以从以下几个方面进行深入探讨&#xff1a; 前言 双向绑定是现代前端框架的核心特性之…

【sql】sql中true,false 和 null之间and、or运算的理解。

select true and null "tan",false and null "fan",true or null "ton",false or null "fon";结果如下&#xff1a; 怎么理解呢&#xff1f; 很简单&#xff0c;把null当做介于true和false中间的值&#xff0c;也就是如果true1,false…

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

1、在vscode终端执行 get-ExecutionPolicy &#xff0c;显示Restricted&#xff0c;说明状态是禁止的。 2、更改状态: set-ExecutionPolicy RemoteSigned 出现需要管理员权限提示&#xff0c;可选择执行 Set-ExecutionPolicy -Scope CurrentUser 出现的ExecutionPolicy参数后输…

《ATTCK视角下的红蓝对抗实战指南》一本书构建完整攻防知识体系

一. 网络安全现状趋势分析 根据中国互联网络信息中心&#xff08;CNNIC&#xff09;发布的第51次《中国互联网络发展状况统计报告》&#xff0c;截至2022年12月&#xff0c;我国网民规模为10.67亿&#xff0c;互联网普及率达75.6%。我国有潜力建设全球规模最大、应用渗透最强的…

【AI视野·今日NLP 自然语言处理论文速览 第五十七期】Wed, 18 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 18 Oct 2023 Totally 82 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers VeRA: Vector-based Random Matrix Adaptation Authors Dawid Jan Kopiczko, Tijmen Blankevoort, Yuki Marku…

使用 RAG、Langchain 和 Streamlit 制作用于文档问答的 AI 聊天机器人

在这篇文章中&#xff0c;我们将探索创建一个简单但有效的聊天机器人&#xff0c;该机器人根据上传的 PDF 或文本文件的内容响应查询。该聊天机器人使用 Langchain、FAISS 和 OpenAI 的 GPT-4 构建&#xff0c;将为文档查询提供友好的界面&#xff0c;同时保持对话上下文完整。…

EtherCAT转Profinet协议网关使西门子和倍福的PLC实现通讯的方法

通过倍福PLC协议&#xff0c;远创智控YC-ECTM-PN网关能与倍福系列的PLC进行通信&#xff0c;一起探索下如何操作吧。 1.网关通过网线和倍福 PLC、电脑进行连接&#xff0c;如果网口不够&#xff0c;可以使用交换机连接。 开VS软件&#xff0c;新建一个工程&#xff0c;选择对应…

mac idea 解决0% classes 0% lines covered不显示,非快捷键办法

问题如下 网上说了一堆快捷键&#xff0c;冲突了用不了&#xff0c;页面按下面这样点就可以了点击no coverage就行了

高并发下的缓存击穿、雪崩、穿透和分布式锁(三)

一.缓存穿透 概念&#xff1a; 去查询缓存和数据库都不存在的数据&#xff0c;然后大量请求不存在的数据&#xff0c;导致数据库压力过大崩溃。 解决方案&#xff1a; 把不存在的数据null存入缓存&#xff0c;并给个短期的过期时间。 二.缓存雪崩 概念&#xff1a; 缓存采用…

树莓派 Qt中 QCameraInfo 无法使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、QCameraInfo 是什么&#xff1f;二、使用步骤1.测试代码2.解决方案2.1输入命令2.2输出 3. 成功打印了摄像头的信息 总结 前言 提示&#xff1a;这里可以添…

苹果秋季发布会官宣,新款Mac将搭载M3芯片,来势迅猛!

苹果宣布将于 10 月 31 日上午 8 点&#xff08;北京时间&#xff09;举行发布会&#xff0c;这次发布会的主题是「来势迅猛」&#xff0c;旨在为全球的苹果粉丝和科技爱好者带来令人期待的新品发布。这次发布会引人瞩目&#xff0c;因为它将聚焦在 Mac 系列产品以及全新的 M3 …