【Linux基础】gcc编译器

news2024/10/6 2:29:16
  • (꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主🌍
  • 快上🚘,一起学习!
  • 送给读者的一句鸡汤🤔:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏

一、GCC概念

        GCC(GNU Compiler Collection)是一套开源的编程语言编译器集合,由GNU计划开发和维护。GCC支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada等,并被广泛用于各种平台和操作系统上。

二、GCC常用编译命令

1.-o <output>:指定生成的可执行程序或库的输出文件名。

gcc main.c -o myprogram

2.-c:只进行编译,不进行链接,生成目标文件。

gcc -c main.c

3.-g:生成调试信息,以便在调试程序时进行源代码级别的调试。

gcc -g main.c -o myprogram

4.-Wall:打开所有警告信息。

gcc -Wall main.c -o myprogram

5.-Werror:将警告视为错误,编译过程中出现警告时会导致编译失败。

gcc -Werror main.c -o myprogram

6.-std=<standard>:指定要使用的C或C++标准版本,例如 -std=c11 用于C11标准,-std=c++17 用于C++17标准。

gcc -std=c11 main.c -o myprogram

7.-I<dir>:指定头文件搜索路径,<dir>是头文件所在的目录。

gcc -I/usr/include myprogram.c -o myprogram

8.-L<dir>:指定库文件搜索路径,<dir>是库文件所在的目录。

gcc -I/usr/include myprogram.c -o myprogram

9.-l<library>:链接时使用指定的库文件,<library>是库文件名,例如-lm 用于链接数学库。数学库 libm.so

gcc myprogram.c -o myprogram -lm

10.-O<level>:指定优化级别,<level>可以是03之间的数字,-O0表示不进行优化,-O3表示最高级别优化。

gcc -O2 main.c -o myprogram

11.-pthread:用于链接多线程程序,添加对线程库的支持。

gcc -pthread main.c -o myprogram

12.-shared:用于创建动态库(共享库,.so文件)。

gcc -shared -o mylibrary.so mylibrary.c

三、GCC编译过程

        1.预处理(Preprocessing)

        预处理阶段是在编译之前进行的。预处理器根据源代码中的预处理指令(以#开头的指令,如#include、#define等)对源代码进行处理。它主要包括展开宏定义、处理条件编译指令和包含其他文件。

        2.编译(Compilation)

        编译器将预处理后的源代码翻译成汇编语言代码。它会进行语法检查、类型检查和生成相应的汇编代码。

        3.汇编(Assembly)

        汇编器将汇编语言代码转换成机器可执行的目标文件格式,通常是二进制形式的机器码指令。它将每条汇编语言指令翻译成对应的机器指令。

        4.链接(Linking)

        链接器将多个目标文件和库文件合并成一个可执行文件或共享库。它解析符号引用,将符号引用解析为实际的内存地址,并解决多个源文件之间的符号依赖关系。

        5.优化(Optimization)

        优化器在编译过程中应用各种优化技术,以提高生成的可执行文件的性能。优化步骤包括删除冗余代码、减少指令数量、改进内存访问模式等。

        6.生成可执行文件或库

根据链接过程的结果,生成最终的可执行文件或库文件。可执行文件可以直接运行,而库文件可以被其他程序链接和使用。

        这些阶段一起构成了源代码从原始状态到最终可执行文件的转换过程,每个阶段都发挥着重要的作用,确保代码正确、高效地执行。结和开头给出的图示,相信你一定可以理解!

四、可执行文件

1.基本概念

        (1)可执行文件是一种计算机文件,包含了机器代码(二进制指令)和必要的元数据,可以在计算机上直接运行。

        (2)文件格式:可执行文件可以采用不同的文件格式,如Windows上的PE(Portable Executable)格式,Linux上的ELF(Executable and Linkable Format)格式等。

        (3)机器代码:可执行文件包含了计算机特定的机器代码指令,由编译器将源代码翻译而来,用于定义程序的实际执行逻辑和指令序列。

        (4)元数据:可执行文件还包含元数据,用于描述文件本身和程序的其他信息,如程序入口点、代码段、数据段、符号表、导入表、导出表等。

        (5)执行过程:当可执行文件被执行时,操作系统将其加载到内存并开始执行其中的机器代码,通过操作系统分配内存空间、加载依赖的库文件、处理系统调用等操作。

        (6)可移植性:可执行文件具有可移植性,可以在不同的计算机系统上运行,只要目标系统支持相应的文件格式和硬件架构。这使得可执行文件在不同操作系统和平台上进行部署和共享成为可能。

        可执行文件是将源代码转化为机器代码的最终产物,可以直接在计算机上运行。它是软件开发中的重要组成部分,使得程序可以被用户或其他系统使用。

2.组成部分

  1. 文件头(File Header):包含了关于文件本身的元数据信息,如文件格式、目标平台、入口点地址等。

  2. 代码段(Code Segment):包含了可执行程序的机器代码指令,用于定义程序的实际执行逻辑和指令序列。

  3. 数据段(Data Segment):包含了程序使用的静态数据,如全局变量、静态变量等。

  4. 符号表(Symbol Table):记录了程序中使用的符号(变量、函数等)和它们的内存地址或位置,用于链接和调试。

  5. 调试信息(Debug Information):可选的部分,包含了与源代码调试相关的信息,如变量名、源代码行号映射等。

  6. 导入表(Import Table)和导出表(Export Table):导入表记录了可执行文件所依赖的其他外部库或函数的引用,导出表记录了可执行文件自身提供给其他程序使用的符号。

3.readelf命令

  readelf是一个命令行工具,用于查看和分析可执行文件、目标文件和共享库的内部结构和内容。它提供了对ELF(Executable and Linkable Format)文件的详细分析能力。

  1. ELF头部(ELF Header):readelf -h <file>显示文件的ELF头部信息,包含文件的基本属性和元数据。

  2. 节表(Section Table):readelf -S <file>显示文件的节表信息,列出文件中各个节的详细信息,如名称、大小、属性等。

  3. 符号表(Symbol Table):readelf -s <file>显示文件的符号表信息,列出文件中定义和引用的符号的详细信息,如符号名称、地址、大小等。

  4. 动态链接(Dynamic Linking):readelf -d <file>显示文件的动态链接信息,包括文件依赖的动态链接库、符号解析和重定位信息等。

  5. 调试信息(Debug Information):readelf -wi <file>显示文件的调试信息,包括源代码文件名、行号映射、局部变量和类型信息等,有助于调试和源代码级别的分析。

        通过使用readelf命令,开发者可以深入了解和分析可执行文件的结构和内容,以及依赖关系、符号引用和调试信息等,从而更好地理解和优化程序的执行和调试过程。

五、GCC的特点与用途 

  1. 多语言支持:GCC支持多种编程语言,包括C、C++、Fortran、Java、Ada等。
  2. 跨平台:GCC可在多种操作系统和平台上使用,如Linux、Unix、macOS和Windows等。
  3. 优化编译:GCC提供丰富的优化选项,可提高生成代码的执行效率和性能。
  4. 标准兼容性:GCC遵循各种编程语言的标准规范,确保生成的代码与标准一致。
  5. 扩展性:GCC允许使用编译器扩展和语言扩展,支持更丰富的功能和特性。
  6. 开源自由:GCC基于GNU通用公共许可证(GPL),是自由软件,可自由使用、修改和分发。
  7. 交叉编译:GCC支持交叉编译,可在一个平台上生成针对另一个不同平台的可执行代码。
  8. 调试支持:GCC与调试器(如GDB)紧密集成,提供强大的调试功能。
  9. 可移植性:由于GCC的广泛支持和开源自由的特性,它具有很高的可移植性,可在不同平台和操作系统上使用。

        总之,GCC是一个功能强大且广泛使用的编译器集合,为开发者提供了多语言支持、跨平台能力、优化编译选项等特性,帮助开发者创建高效、可移植的软件。

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

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

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

相关文章

【IMX6ULL - psplash应用】修改uboot启动阶段的背景颜色

文件路径&#xff1a;psplash/psplash-colors.h 修改框起来的这两个宏定义就可以改变底部颜色了&#xff0c;参数代表是RGB的16进制颜色

Linux 支持 U盘 NTFS 文件系统格式

Linux 支持 U盘 NTFS 文件系统格式 1、在线&#xff08;可以连接外网&#xff09;方式&#xff1a; 1.1、RHEL/CentOS/Anolis/openEuler yum install ntfs-3g1.2、Debian/Ubuntu/Deepin apt install ntfs-3g2、离线方式 下载 ntfs-3g 安装包&#xff0c;离线环境安装 ntfs…

算法通关村第一关--链表青铜挑战笔记

算法通关村第一关–链表青铜挑战笔记 开始时间&#xff1a;2023年7月16日20:45:26 链表 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#x…

解决通过request.getParam()方法获取到的值为null的问题~

我们想获取前端表单提交的数据&#xff0c;并在控制台输出&#xff0c;但如下所示控制台输出的值均为null 原因在于&#xff1a; 表单中的name与getParam方法中名称不一致的问题 如下所示为表单内容&#xff1a; 而在getParam方法中我们是根据username和password获取的&#…

【LLM】Langchain使用[四](评估、代理)

note 评估目的&#xff1a;检验LLM是否达到验收标准&#xff1b;分析改动对于LLM应用性能的影响 思路&#xff1a;利用语言模型和链&#xff0c;辅助评估 代理&#xff1a; 代理能方便地将LLM连接自己的信息来源&#xff08;数据&#xff09;、API等PythonREPLTool工具&#x…

WSL2安装CUDA

WSL2安装CUDA 在WSL里面不用安装显卡驱动&#xff0c;显卡驱动必须要提前在Windows系统里面安装好&#xff0c;安装好后相应库文件会自动映射到WSL里面 进入网站 找到自己需要的版本&#xff0c;我这里是CUDA 11.7.1&#xff0c;点击进入详细页面 依次选择 L i n u x → x 86…

IP扫描工具

什么是高级 IP 扫描仪 高级 IP 扫描程序是网络中必不可少的工具&#xff0c;使管理员能够跟踪网络地址空间。在提供要扫描的 IP 地址范围时&#xff0c;高级 IP 扫描程序会借助网络扫描协议按顺序检查该范围内的每个 IP&#xff0c;扫描后&#xff0c;高级 IP 扫描程序工具可查…

【MongoDB实战】数据备份与恢复

场景&#xff1a; 需求&#xff1a; 解决方案&#xff1a; 步骤&#xff1a; Stage 1&#xff1a;【生产环境】修改备份文件映射 Stage 2&#xff1a;【生产环境】重新构建mongodb Stage 3&#xff1a;【客户环境】修改备份文件映射&#xff0c;同 Stage 1 Stage 4&#…

python接口自动化(四十)- logger 日志 - 下(超详解)

简介 按照上一篇的计划&#xff0c;这一篇给小伙伴们讲解一下&#xff1a;&#xff08;1&#xff09;多模块使用logging&#xff0c;&#xff08;2&#xff09;通过文件配置logging模块&#xff0c;&#xff08;3&#xff09;自己封装一个日志&#xff08;logging&#xff09;类…

Stable Diffusion配置要求,显卡推荐

Stable Diffusion 是一款流行的人工智能图像生成器&#xff0c;您可以在自己的 PC 上运行。但是运行Stable Diffusion的最低规格是多少&#xff0c;哪些组件最重要&#xff1f; Stable Diffusion需要什么 PC 硬件&#xff1f; Stable Diffusion最关键的一个组件是显卡 (GPU)。…

LaTex 中的Beamer使用

LaTex 中的Beamer使用 Beamer beamer 中通过frame 来控制每一页的内容&#xff0c;其与编写常用的LaTex文稿基本没有区别 titlepage \title[Short Title]{My Presentation} \subtitle{An Introduction to LaTeX Beamer} \author{River Chandler} \institute{Sichuan Universi…

国科大杭州高等研究院

2021年底的我还没决定开始考研 &#xff0c;过完年才确定开始考研&#xff0c;开学以后才开始学习&#xff0c;此时距离22年底考试时间差不多十个月的样子。 2022年开始正式学习&#xff0c;2 2 408&#xff0c;对于我来说内容挺多挺难的&#xff0c;我英语不太好&#xff0c;以…

懒人自动化生成e2e测试文件:JSON => playwright

前言 本工具实现的是&#xff1a;使用简单的 JSON 配置&#xff0c;生成可执行的 playwright UI 测试文件。 然后通过项目内已经配置好的 playwright 配置实现 UI 测试。 工具工作流程&#xff1a; 期望达到的目的是&#xff1a; ✅ 基础页面&#xff08;进入页面&#xff0…

加密保SSL超安通配版

今天收到几家公司网络IT经理询问&#xff1a;“要买“加密保SSL超安通配版”问有没有&#xff1f;” 这里特别强调一下&#xff01; “加密保SSL超安通配版”这不是国产SSL证书&#xff0c;不是国产SSL证书&#xff0c;属于套牌PKI类型非CA机构官方产品&#xff01; 这是经销…

cuda_11.6.1_510.47.03_linux.run

cuda_11.6.1_510.47.03_linux.run Installing the latest CUDA toolkit cuda_11.6.1_510.47.03_linux.run Download Installer for Linux Ubuntu 20.04 x86_64 cuda_11.6.1_510.47.03_linux.run

【Spring】Spring更简单的读取和存储对象---使用注解

目录 1.Spring的存储对象------存储Bean对象 1.前置工作&#xff0c;配置扫描路径 2.添加注解存储Bean对象 1.Controller&#xff08;控制器存储&#xff09; 2.service&#xff08;服务存储&#xff09; 3.Repository&#xff08;仓库存储&#xff09; 4.Component&…

二叉树展开为链表

给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例 1&…

CVE-2023-1454注入分析复现

简介 JeecgBoot的代码生成器是一种可以帮助开发者快速构建企业级应用的工具&#xff0c;它可以通过一键生成前后端代码&#xff0c;无需写任何代码&#xff0c;让开发者更多关注业务逻辑。 影响版本 Jeecg-Boot<3.5.1 环境搭建 idea 后端源码&#xff1a; https://git…

【Java SpringBoot Starter】开发一个自己的SpringBoot Starter组件,应该怎么写,需要什么配置

【Java SpringBoot Starter】开发一个自己的SpringBoot Starter组件&#xff0c;应该怎么写&#xff0c;需要什么配置 目录 1. 自定义的Starter&#xff0c;需要的Configuration 类 2. .properties文件的配置&#xff0c;或者yml文件的配置内容&#xff0c;注入bean对象中 …

行业报告 | AI 赋能,人形机器人产业提速,把握产业链受益机会(上)

文 | BFT机器人 01 核心观点 核心观点: 人形机器人产业发展仍处于 0-1 阶段&#xff0c;当前行业投资逻辑偏向事件驱动型的主题投资&#xff0c;但可落地服务场景的人形机器人成长空间非常广阔&#xff0c;值得长期关注。本文将围绕以下热点问题作出讨论: D当前节点人形机器人产…