首页 > 系统相关 >【Linux应用开发】gcc编译过程

【Linux应用开发】gcc编译过程

时间:2024-03-24 19:02:26浏览次数:24  
标签:tmp 文件 gcc 汇编 编译 Linux hello

        gcc是一个c编译器,​可以将源代码转换为可执行程序。编译过程包括了预处理、编译、汇编和链接这四个阶段。

  1. 预处理(Preprocessing):在预处理阶段,源代码会经过预处理器的处理,包括展开宏定义、包含头文件、条件编译等操作。预处理器会生成一个经过预处理的中间文件。

  2. 编译(Compilation):编译阶段将预处理后的源代码翻译成特定目标平台的汇编语言。编译器会将高级语言代码翻译成汇编代码,生成一个汇编代码文件。

  3. 汇编(Assembly):汇编阶段将汇编代码转换成目标平台的机器码或可重定位的目标文件。汇编器会将汇编代码转换为目标文件,通常以 .o 或 .obj 扩展名结尾。

  4. 链接(Linking):链接阶段将目标文件与所需的库文件链接在一起,解析符号引用并生成可执行文件。链接器会解析符号引用,并将它们解析为实际的内存地址,最终生成可执行文件。

gcc -E -o hello. i hello.c #预处理过程
gcc -s -o hello.s hello.i #编译过程
gcc -c -o hello. o hello.s #汇编过程
gcc -o hello hello.o #链接过程

        执行“gcc -o hello hello.c -v”时,可以查看到这些步骤:(这个命令是用于编译名为 hello.c 的 C 语言源代码文件并生成可执行文件 hello。选项 -o 用于指定输出文件的名称,-v 选项用于显示详细的编译过程信息。)

cc1 main.c    -o /tmp/ccXCx1YG.s
as            -o /tmp/ccZfdaDo.o /tmp/ccXCx1YG.s


cc1 sub.c     -o /tmp/ccXCx1YG.s
as            -o /tmp/ccn8Cjq6.o /tmp/ccXCx1YG.s
collect2      -o test /tmp/ccZfdaDo. o /tmp/ccn8Cjq6.o 
  1. cc1:将.c文件处理成.s文件,对应预处理和编译过程。

  2. as:将.s文件处理成.o文件,对应汇编过程。

  3. collect2:将.o文件处理成可执行文件,对应链接过程。

标签:tmp,文件,gcc,汇编,编译,Linux,hello
From: https://blog.csdn.net/2301_79931971/article/details/136992254

相关文章

  • Linux收到一个网络包是怎么处理的?
    目录摘要​编辑1从网卡开始2硬中断,有点短2.1GameOver3接力——软中断3.1NET_RX_SOFTIRQ软中断的开始3.2数据包到了协议栈3.3网络层处理3.4传输层处理4应用层的处理5总结摘要    一个网络包的接收始于网卡,经层层协议栈的解析,终于应用层。......
  • Docker的Linux网络基础
    Docker技术依赖于近年来Linux内核虚拟化技术的发展,所以Docker对Linux内核有很强的依赖。本文将Docker使用到的与Linux网络有关的主要技术进行简单介绍。 一、网络命名空间为了支持网络协议栈的多个实例,Linux在网络栈中引入了网络命名空间,这些独立的协议......
  • linux curl p12请求
    ##查看curl版本curl-V##查看curl指令curl--help#--cert证书#--cert-typeTYPECertificatefiletype(DER/PEM/ENG)(SSL)由此可看出linux下curl暂不支持p12证书由p12生成pem证书##生成时如果p12证书有密码,需要输入密码##生成key文件命令opensslpkcs12......
  • 「Linux系列」Shell 流程控制if-else/for循环/While循环/until循环/case语句/跳出循环
    文章目录一、Shell流程控制二、If语句三、For循环四、While循环五、Until循环六、Case语句七、跳出循环break/continue八、相关链接一、Shell流程控制Shell脚本中的流程控制结构允许你根据条件执行不同的代码块,或者重复执行某些代码块。这些结构包括if语句......
  • 【C++】Linux多线程开发
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录3.1线程概述3.2创建线程3.3、线程终止3.4连接已经终止线程3.5线程的分离3.6线程取消3.7线程属性3.8线程同步3.9互斥锁3.10死锁3.11读写锁3.12生产者和消费者模型3.13条件......
  • Linux:网络套接字的认识和基本实现通信
    文章目录UDP和TCP协议网络字节序socket编程常见的接口套接字本篇总结的是对于网络套接字的基本认识UDP和TCP协议在谈网络套接字前,必须先对于UDP和TCP这两个协议有一个基本的认识,这两个协议都是隶属于传输层的协议,并且这两个协议距离用户来说是最近的,所以一般以数据......
  • Linux打包---Deb包安装和卸载
    包名规则:  package_version-revision_arch.deb dpkg安装信息查看参数:   #dpkg--debug=100:打印安装日志  #dpkg--log=filename:打印日志到文件  #dpkg-x或dpkg-X:将deb包内文件解压出来 安装过程目录/etc/dpkg/dpkg.cfg     ......
  • gcc编译步骤与常用参数
    1.gcc编译步骤与常用参数1.1.编译步骤源码hello.c只有寥寥几行代码#include<stdio.h>intmain(void){printf("hello\n");}执行-E预处理,得到hello.i,生成了很长的.i文件-S编译helloc.s,这一步是最重要的,得到的反汇编文件,可以看出很多问题:-c汇编得到hello.......
  • FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
    ​《FFmpeg开发实战:从零基础到短视频上线》一书的“12.1.2 交叉编译Android需要的so库”介绍了如何在Windows环境交叉编译Android所需FFmpeg的so库,接下来介绍如何在Linux环境交叉编译Android所需FFmpeg的so库。1、下载Linux版本的android-ndk-r21e登录Linux服务器(比如华为云的......
  • Linux指令入门
    目录Linux1.版本2.指令基本认识指令ls指令pwdcdtouch.mkdir**指令(重要):treermdir**指令**&&rm指令(重要):mv相当于window系统的剪切man指令cpmvcatmore重定向简单的while循环(构建一个大文件)head时间相关的指令cal(日历)find**指令:(灰常重要-namegrep......