IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 程序的环境和预处理 -> 正文阅读

[系统运维]程序的环境和预处理


1.程序的环境

写过无数代码的你是否想过你写的.c文件编译链接运行形成.exe文件的中间是怎样执行的吗?
从.c文件到.exe文件到代码的执行,这就是过程。
在这里插入图片描述

.c文件我们叫做源文件,是文本文件,.exe文件是可执行文件,是二进制文件,是机器能够读懂的文件。
在.c文件编译链接形成.exe文件的环境我们成为编译环境,.exe执行的环境我们称为运行环境
编译环境又可以分为编译链接两个过程。而编译过程又可以分为预编译编译汇编三个过程。
在这里插入图片描述
我们的代码进行编译所需要的工具是编译器,例如VS2013等等编译器。
我们每一个源文件(.c),头文件(.h)都是通过编译器(vs编译器下的编译器是cl.exe)单独编译生成目标文件(.obj)最后通过链接器(vs编译器下的链接器link.exe)形成可执行程序。这就是编译的过程。我们接下来分为三个小步来具体解析编译的过程。
在这里插入图片描述

在这里插入图片描述
当我们走到这里,我们用vs观看就已经不再直观,我们要使用Linux下的编译环境用gcc编译器观看会更加的直观。所以接下来的操作都是在Linux环境下进行操作的。如果对Linux编译环境有兴趣的,可以点击下面一个链接能够让你轻松入门Linux。

Linux轻松入门

预编译

1.头文件的包含

在这里插入图片描述
这是我们在Linux环境下写的代码。然后执行 gcc test.c -E -o test.i

在这里插入图片描述
执行后,代码前面少了#include<stdio.h>,多了一大串其实的实际代码。当我们把#include<stdio.h>去掉后再执行
gcc test.c -E -o test.i
在这里插入图片描述
可以清晰的看到代码少了很多。

2.#define的预处理指令的执行

将#define定义的代码直接替换掉

在这里插入图片描述
编译之后的结果:
在这里插入图片描述

3.注释的删除

我们进行的注释在预编译是直接删除掉的。
在这里插入图片描述

编译之后的结果:
在这里插入图片描述

编译

编译的过程是将我们的C语言代码编译成了汇编代码。
这其中包括:
1.词法分析
2.语法分析
3.语义分析
4.符号汇总
这门课程叫做《编译原理》有兴趣的同学可以自己学习。
在Linux操作系统下的操作是
gcc test.i -S
这样就会生成一个test.s的文件

在这里插入图片描述

汇编

汇编就是把汇编代码转换成二进制指令(机器指令)
再一个就是形成符号表。
Linux下的操作是
gcc test.s -c
这样就生成了一个test.o的二进制文件
相当于是VS编译下形成的test.obj 文件
如图是一段我们看不懂的指令,其实.obj文件的格式是elf格式,在Linux下输入指令readelf就能实现相应的操作。
在这里插入图片描述

链接

1.合并段表

Linux指令
readelf test.o -a
在这里插入图片描述

2.符号表的合并和重定向
就是每个文件都有自己的符号表,合并和重定位就是将所有的符号汇总,例如在另外一个文件声明定义的函数,在这个文件中使用。总体来说就是链接所有的文件。

运行

  1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序
    的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  2. 程序的执行便开始。接着便调用main函数。
  3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回
    地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程
    一直保留他们的值。
  4. 终止程序。正常终止main函数;也有可能是意外终止。

谢谢大家!!!!!

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 20:02:38  更:2021-11-09 20:02:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:01:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码