首页 > 系统相关 >linux—— 使用gcc解析程序四个阶段

linux—— 使用gcc解析程序四个阶段

时间:2022-10-19 10:36:34浏览次数:49  
标签:yzq gcc centos 文件 VM linux test 解析

(文章目录)

一、gcc

1.gcc的安装

yum -y install gcc-c++ autoconf pcre pcre -devel  make automake
yum -y install wget httpd-tools vim

2.gcc 的默认使用

[yzq@VM-8-8-centos ~]$ cat test1.c
#include<stdio.h>
int main()
{
 printf("hello world!");
 return 0;
 }
[yzq@VM-8-8-centos ~]$ gcc test1.c
[yzq@VM-8-8-centos ~]$ ls
a.out  install.sh  lesson5  mk  test1.c
[yzq@VM-8-8-centos ~]$ ./a.out
hello world!

通过使用 gcc +文件名,默认产生了一个a.out的可执行程序,再通过./ 打印出结果

3. 创建一个可命名的可执行程序

[yzq@VM-8-8-centos ~]$ cat test1.c
#include<stdio.h>
int main()
{
 printf("hello world!");
 return 0;
 }
[yzq@VM-8-8-centos ~]$  gcc test1.c -o mybin
[yzq@VM-8-8-centos ~]$ ./mybin
hello world!

gcc +文件名 -o +自己命名的可执行程序 gcc test1.c -o mybin ——把test.c文件编译形成一个可执行程序mybin 运行 ./mybin 即可运行程序

4.程序执行过程

1. 预处理阶段

1. test.c文件

#include<stdio.h>
#define M 1234
int main()
{
printf("%d\n",M);//这是一行c语言的代码
printf("%d\n",M);//这也是一行c语言的代码
return 0;
}

使用 vim test.c ,进入test.c文件

2. test.i 文件

gcc -E

完成预处理阶段

gcc -E test.c -o test.i

把test.c文件 完成预处理阶段的临时内容 写入test.i文件中

使用 vim test.i进入 test.i文件,同时在插入模式下输入vs test.c 在这里插入图片描述 就会导致分为 test.c (左)和test.i(右)两个,使两者分屏

3.宏的替换

在这里插入图片描述

test.c文件中,是有宏的存在

在这里插入图片描述

而在右边的test.i文件中,已经完成了对宏的替换

4. 注释的消除

在这里插入图片描述

test.c文件中,注释是存在的。

在这里插入图片描述

test.i文件中,发现注释已经被消除。

5.头文件的展开

在这里插入图片描述

test.c文件中,包含头文件 stdio.h

在这里插入图片描述

test.i文件中,引入了stdio.h,并将所有头文件都展开以及相关头文件的内容都拷贝进来。

2.编译阶段

gcc -S

完成编译阶段

gcc -S test.i -o test.s

这里使用,test.i而不是使用test.c的原因,是因为我们想要调查预处理阶段完成到编译阶段完成这段 把test.i文件完成编译的临时内容 写入 test.s文件中

vim test.s

在这里插入图片描述test.s文件中出现了汇编语言

3.汇编阶段

gcc -c

完成汇编阶段

gcc -c test.s -o test.o

从test.s开始,是因为已经完成了遇到护理阶段和编译阶段 完成编译阶段,把临时内容放入test.o文件中

vim test.o

在这里插入图片描述

test.o文件中,出现了一堆看不懂的东西,实际上是 二进制文件

汇编阶段: 汇编语言到 obj目标二进制文件

汇编阶段 (二进制)不可执行
[yzq@VM-8-8-centos lesson5]$  ./test.o
-bash: ./test.o: Permission denied

正常情况下执行

[yzq@VM-8-8-centos lesson5]$ chmod u+x test.o
[yzq@VM-8-8-centos lesson5]$  ./test.o
-bash: ./test.o: cannot execute binary file

将文件的拥有者加上执行的权限 也不可以执行

原因:此时还没有将第三方库引入,如调用printf、scanf的c语言标准库

4.链接阶段

本质是引入我们在代码中使用的第三方库,如c语言标准库

yzq@VM-8-8-centos lesson5]$ gcc test.o -o mybin
[yzq@VM-8-8-centos lesson5]$  ./mybin
1234
1234

gcc根据文件,会默认连接(由编译器和文件共同决定的)第三方库 执行程序,并命名为mybin

标签:yzq,gcc,centos,文件,VM,linux,test,解析
From: https://blog.51cto.com/u_15787387/5765379

相关文章

  • Linux学习-2
    虚拟机关键配置名词解释虚拟⽹络编辑器说明 桥接模式  可以访问互联⽹   配置的地址信息和物理主机⽹段地址信息相同,容易造成地址冲突   NAT模式 ......
  • 移动linux根目录的文件
    如果不小心执行了移动了根目录的文件到别的目录里面,当前会话已关闭咋恢复一、没关闭当前会话通过mv命令进行移动回来二、会话关闭如果买的是腾讯云的服务器或者......
  • Linux系统编程 第1、2章学习笔记
               ......
  • Linux 源码编译安装实现LAMP架构
    1.apache服务编译安装https://www.cnblogs.com/heyongshen/p/16803125.html说明:  编译安装默认不支持fastcgi功能和反向代理功能相关配置:  开启fastcgi功能和反向......
  • 2022-10-19 react解析富文本
    <divdangerouslySetInnerHTML={{__html:values.content}}></div>dangerouslySetInnerHTML是react标签的一个属性,后面的__html跟返回的富文本数据。注:使用innerHTML......
  • Linux安装Kafka(Docker方式)
    安装步骤(已亲测好使):#笔者版本ZOOKEEPER_VERSION=3.4.13//DockerVersion=18.03.1-ee-3#拉zookeeper镜像dockerpullwurstmeister/zookeeper#笔者版本KAFKA_VERSION......
  • Linux生成随机数
      在日常测试过程中,需要经常Mock部分数据,使其看起来具有随机性,虽然可以通过高级程序语言来进行实现,也非常高效快捷。除此之外还有没有其他办法呢?今天我们来探讨一下,在L......
  • linux常用命令
    1、常用命令命令对应英文作用lslist查看当前目录下的内容pwdprintworkdirectory查看当前所在目录cd[目录名]changedirectory切换目录touch......
  • Linux类常用命令
    1.浏览目录类命令1.1pwd命令pwd命令用于显示用户当前所处的目录。[root@localhost~]#pwd/root1.2cd命令cd命令用来在不同的目录之间切换[root@localhost~]#c......
  • (一)GCC
    1.GCC简介GCC原名为GNUC语言编译器(GNUCCompiler)GCC(GNUCompilerCollection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、Objective-C、......