C编程的基本策略是使用程序将源代码转换为可执行文件,此文件包含可运行的机器语言代码。C分两步完成这一工作:编译和链接。编译器将源代码转换为中间代码,连接器将此中间代码与其他代码相结合来生成可执行文件。C使用被划分为两部分的这一方法使程序便于模块化,你可以分别编译各个模块,然后使用连接器将编译过的模块结合起来。这样,如何需要改变一个模块,则不必重新编译所有其他模块。同时,链接器将您的程序与编译的库代码结合起来。

中间文件的形式有多种选择。最一般的选择,同时也是我们这里讲述的实现方式所采取的选择,是将源代码转换为机器代码。将结果放置在一个目标代码文件(或简称目标文件)中(这里假定您的源代码由单个文件组成)。虽然目标文件包含机器语言代码,但该文件还不能运行。目标文件包含源代码的转换结果,但它还不是一个完整的程序。

目标代码文件中所缺少的第一个元素是一种叫做启动代码(Start-up code)的东西,此代码相当于您的程序和操作系统之间的接口。例如你可以在dos 或Linux下运行一个 IBM PC 兼容机,在两种情况中硬件是相同的,所以都会使用同样的目标代码,但是 DOS与Linux要使用不用的启动代码,因为这两种系统处理程序的方式不同的。

所缺少的第二个元素是库例程的代码。几乎所有C程序都利用标准库中所包含的例程(称为函数)。例如,前面的concrete.c使用了函数printf()。目标代码文件不包含这一函数的指令。实际代码存储在另一个称为“库”的文件中,库文件中包含许多函数的目标代码。

链接器的作用是将这3个元素(目标代码、系统的标准启动代码和库代码)结合在一起,并将他们存放在单个文件,即可执行文件中。对库代码来说,链接器只从库中提取您所使用的函数所需的代码(见图1.4所示)

简而言之,目标文件和可执行文件都是由机器语言指令组成的。但目标文件只包含您所编写的代码转换成的机器语言,而可执行文件还包含您所使用的库例程以及启动代码。

目标代码文件、可执行文件和库相关推荐

  1. C基础——目标代码文件、可执行文件和库

    目标代码文件.可执行文件和库 C编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码.C分两步完成这一工作:编译和链接.编译器将源代码转换为中间代码,链接器将此中间代 ...

  2. 解释源代码文件、目标代码文件和可执行文件之间的区别

    源代码到可执行文件的过程: 编译器驱动程序读取源文件(hello.c和main.c),经过预处理.编译.汇编.链接(分别使用预处理器.编译器.汇编器.链接器,这四个程序构成了编译系统)四个步骤,将其翻 ...

  3. Keil实现软件版本号与实际编译生成的目标代码版本自动一一对应

    为何有这个需求? 做嵌入式软件开发的人对于手工维护版本号总是心有抵触.因为代码提交很频繁,如果每次提交都需要手动修改子版本号,不胜其烦.而且难免会有遗漏的时候,这样版本号就失去了意义,并不能指明其与代 ...

  4. 软件安全之代码注入技术 向目标 PE 文件注入 DLL notepad lpk.dll 远程线程函数 提权函数 OpenProcess VirtualAllocEx

    实验 4 代码注入技术 引言 1.实验说明 代码注入是将用户代码注入到其他进程或者可执行文件中,实现拦截目标进程运行过程的关键信息.改变目标进程或可执行文件原本执行流程等目的 2.实验目的 本实验通过 ...

  5. .h头文件 .lib库文件 .dll动态库文件之间的关系

     .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和li ...

  6. linux编译静态库的头文件,条件编译,头文件,静态库,共享库与多文件编程

    条件编译 条件编译即满足某些条件的时候编译某部分代码,常用于开发多个版本的程序,当满足条件A时,编译出免费版本的软件,当满足条件B时,编译除vip版本的软件,可以提高代码的复用率.条件编译使用&quo ...

  7. linux 头文件卫士,条件编译,头文件,静态库,共享库与多文件编程

    原标题:条件编译,头文件,静态库,共享库与多文件编程 本文转载自嵌入式Linux中文站条件编译 条件编译即满足某些条件的时候编译某部分代码,常用于开发多个版本的程序,当满足条件A时,编译出免费版本的软 ...

  8. linux静态库添加文件,Linux静态库和动态库的编写和使用

    Linux静态库和动态库的编写和使用 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1  静态库和动态库的区别 1.1. 静态函数库 (1)静态函数库的名 ...

  9. 库文件、静态库(lib)与动态库(dll)的生成与使用

    静态库 程序编译一般需经预处理.编译.汇编和链接几个步骤.在应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所需的代码,复制到 ...

最新文章

  1. 2017年深度学习必读31篇论文(附下载地址)
  2. 如何从Java中打印XML?
  3. /etc/cron.deny 中关闭某一用户的 crontab
  4. 哈夫曼编码c语言例题,关于哈夫曼编码试题的计算
  5. 微软推出 Go 语言免费中文教程,真香!
  6. python报时功能_Python(PyS60)做的简单语音整点报时的实现
  7. [SPOJ] COT2 树上莫队
  8. 腾讯认证QQ空间秒升级为专业版方法!
  9. 英国议会上院AI报告AI in the UK-ready, willing and able附原文183页(赞赏后下载ZIP包)
  10. java 屏蔽广告js_手机端JS屏蔽广告
  11. 抑制剂拮抗剂等小分子化合物
  12. R语言使用quantmod包的getSymbols函数从指定金融数据源获取指定时间段的股票数据、获取美国10年期债券收益率数据
  13. 基于Java的乐嘉网络商城系统(毕设)
  14. mysql详解(全)
  15. 很好的例子理解区别 Maximum Likelihood (ML) Maximum a posteriori (MAP)
  16. 纽约大学坦登学院计算机专业,纽约大学坦登工程学院
  17. 程序员的奋斗史(十三)——我为什么不考研
  18. 送书 | 火遍日本 IT 界的「鱼书」终出续作!!!!
  19. GTP与MBR硬盘分区区别(UEFI介绍)
  20. 软件测试:sql注入·依赖基本sql语句

热门文章

  1. ArcGIS Engine开发前基础知识(4)
  2. 设置同一Label内涵不同颜色字体
  3. 树结构练习——排序二叉树的中序遍历(二叉搜索树)
  4. Word2003文档打不开怎么办?1分钟帮你解决!
  5. 用Photoshop打造怀旧色调美女照片
  6. ASP.NET命名规范
  7. EventHandler, EventArgs
  8. 计算机教授技术追踪劫匪,打脸 911警察
  9. 静态类型检查—Flow入门
  10. Android nomedia 避免图片等资源泄露在系统图库其中