引入:

1、程序的翻译和执行环境

在ANSI C的任何一种实现中,存在两种不同的环境。

第一种是翻译环境,在这个环境中,源代码被转化为可执行的机器指令。

第二种是执行环境,它用于实际执行代码。

<1>翻译环境

组成一个程序的每个源文件通过编译过程分别转化为目标代码。(object code)。

(Windows环境下文件后缀为.obj,Linux环境下后缀为.o)

每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。

链接器同时也会引入标准C函数库之中任何被该程序用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。

简而言之,翻译环境就是:源文件->编译、链接->可执行文件这个过程中所处的环境。

<2>执行环境

可执行程序运行的环境。

2、编译本身也分为了几个阶段

<1>预编译:

预编译:gcc test.c -E(Linux)

1、头文件的包含。

#inlcude是一种预处理指令

2、#define定义符号的替换。

#define也是预处理指令

3、注释删除。

总结:预编译做文本操作。

<2>编译:

编译:gcc test.i -S(test.i是预处理产生的文件)(产生test.s)(Linux环境下)

把C语言代码翻译成了汇编代码

包含了:

1、语法分析

2、词法分析

3、语义分析

*4、符号汇总(汇总全局符号,函数名(自定义函数)啥的,还有main,局部符号不会汇总)

(出错就编不过去,报错)

<3>汇编:

汇编:gcc test.s -c(会生成test.o)(Linux环境下)

windows环境下目标文件是.obj

Linux环境下的目标文件是.o

目标文件是二进制的

将汇编指令翻译成二进制指令

形成符号表(将编译过程中汇总的符号形成一个表,一 一 对应)。

<4>链接:

把前几个文件和链接库放在一起

1、合并段表

2、符号表的合并和重命名(就是类似找到汇总的符号的有效地址,例如在源文件中声明了一个函数假设叫Func,如果有声明,有定义,在符号汇总时,会将两个Func符号都汇总,而由Func函数的声明收集而来的Func符号其实对应的是一个无效地址,而由Func函数实现部分收集而来的Func符号就会对应一个有效地址,在链接时,如果遇到那个对应无效地址的Func符号,就会去符号表中找是否有该符号的有效地址,若有,就合并,若没有,但是使用到了这个函数,就会报错,说该Func函数未定义)。

3、运行环境

程序执行的过程:

<1>程序必须载入内存中。在有操作系统的环境中,这个操作一般由操作系统完成。在独立的环境之中,程序的载入由手工安排,也可能是通过可执行代码置入可执行内存来完成。

<2>运行环境是程序一旦执行便开始,接着便调用main主函数。

<3>开始执行程序代码。这个时候将使用一个运行时堆栈(stack),储存函数的局部变量和返回地址。(函数栈帧的创建和销毁)程序同时也可以使用静态内存(static)存储于静态内存中的变量在程序的整个执行过程中一直保留它们的值。

<4>终止程序。正常终止main函数,也可能非正常终止。

水平有限,欢迎指正。

C语言程序的编译+链接相关推荐

  1. C语言程序的编译+链接详解

    文章目录 前言 一.引子 二.翻译环境 三.运行环境 总结 前言 同学们在写代码的时候,我们往往要先创建一个源文件比如test.c.写完具体代码并运行后,我们的文件夹中会生成一个test.exe的文件 ...

  2. C语言——程序的编译+链接(linux+gcc实现过程)

    文章目录 前言 一.预处理 1.预处理阶段的操作: 1.预处理过程实现: 二.编译 1.编译阶段的操作: 2.编译过程的实现: 三.汇编 1.汇编阶段的操作: 2.汇编过程的实现: 四.链接 1.链接 ...

  3. 一个c语言程序只要编译和链接没有错误,一个 C 语言程序只要编译和链接没有错误,程序运行结果就肯定正确...

    一个 C 语言程序只要编译和链接没有错误,程序运行结果就肯定正确 更多相关问题 网页表单中不能插入表格.() 要想在一个网页中嵌套另外一个网页,一般可以使用页内框架.() 贸易也是一种特殊的技术.() ...

  4. gcc编译c文件_Linux下C语言程序的编译过程

    Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...

  5. 《编译与反编译技术》—第1章1.7节C语言程序的编译流程

    本节书摘来自华章出版社<编译与反编译技术>一书中的第1章,第1.7节C语言程序的编译流程,作者庞建民,陶红伟,刘晓楠,岳峰,更多章节内容可以访问云栖社区"华章计算机"公 ...

  6. 在ubuntu系统下使用gcc和makefile实现c语言程序的编译运行

    目录 前言 一.使用gcc命令完成编译c语言程序 1.编写c语言程序 main1.c sub1.h sub1.c 2.gcc命令编译 步骤一命令:gcc -c sub1.c作用:将sub1.c程序转换 ...

  7. C语言程序makefile编译过程

    C语言程序makefile编译过程 2022-0111 blog_010 makefile是一些大型linux下开发的项目经常会用到的编译脚本: 可以将makefile理解为类似shell一样的脚本语 ...

  8. ubuntu搭建基于arm-none-eabi-gcc,jlink驱动的平台,并实现stm32f103c8t6程序的编译链接和烧写

    ubuntu搭建基于arm-none-eabi-gcc,jlink驱动的环境,并实现stm32f103c8t6程序的编译链接和烧写 说明: 本文内容基于VMware上的ubuntu虚拟机,vmware ...

  9. c语言程序灵魂编译后,谭浩强C程序设计第4版精讲视频课程

    谭浩强<C程序设计>(第4版)网授精讲班[教材精讲+考研真题串讲] 本课程由资深辅导教师马丽梅老师讲授,全面讲解教材的重点.难点.考点,教会学员理解并掌握该教材中的基本概念.基本原理和基本 ...

最新文章

  1. 自学Python十二 战斗吧Scrapy!
  2. 文件权限二(特殊权限、隐藏属性、文件访问控制列表、切换用户方式)
  3. 函数式编程工具:filter和reduce
  4. Struts2学习笔记《二》
  5. 前端学习(2867):vue3数据劫持解析2
  6. 40岁从零开始学习软件开发,四年后我成了首席研发
  7. 从一盏路灯,看亿万级联接的智能之路
  8. Sphinx——自动生成Python文档
  9. Kaggle比赛(二)House Prices: Advanced Regression Techniques
  10. ARM计划将四核心CPU引入磁盘驱动器
  11. 计算机组成原理实验报告 实验五 三人表决电路实验
  12. 【MCU】一种灵活且省资源的IAP升级方案
  13. PyConChina 2019 深圳站之行
  14. 分类数据之列联表分析案例with sas
  15. 谷歌开源芯片 180 纳米制造工艺
  16. [转载]英语语音断句规则
  17. 2.16([Usaco2005 Nov]Ant Counting)
  18. CAPL入门:结合panel面板实现按钮触发功能
  19. linux查看磁盘使用情况(一)
  20. 文献综述撰写格式及写作技巧

热门文章

  1. [虚幻引擎][UE][UE5]像素流送(Pixel Streaming),像素流去掉黑边和按钮[UE5.1.0],鼠标控制
  2. iOS之iPhone解锁界面的滑动来解锁闪烁动画效果
  3. 佳能6D start
  4. word表格放在文件夹中卡死打不卡(未响应)
  5. 手机5g什么时候普及_要到2021年5G手机才会普及?你认可这个说法么? - 区块网...
  6. 通过脚本控制播放音频
  7. 家用投影仪品牌推荐,如何选择家用投影仪?
  8. Mysql中的force index和ignore index
  9. 算法leetcode|11. 盛最多水的容器(rust重拳出击)
  10. [详解]ArchLinux下Wine的使用