网站大量收购闲置独家精品文档,联系QQ:2885784924

从HelloWorld说程序运行机制.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
从Hello World说程序运行机制 学习任何一门编程语言,都会从Hello World 开始。对于一门从未接触过的语言,在短时间内我们都能用这种语言写出它的Hello World。然而,对于Hello World 这个简单程序的内部运行机制,我相信还有很多人都不是很清楚。 Hello World 这些信息是如何通过显示器显示的?cpu执行的代码和程序中我们写的的代码肯定不一样,她是什么样子的?又是如何从我们写的代码变成cpu能执行的代码的?程序运行时代码是在什么地方?她们是如何组织的?程序中的变量存储在什么地方?函数调用是怎样实现的? 这篇文章将简单的讨论程序的运行机制。开发平台隐藏的过程。每一种语言都有自己的开发平台,我们的程序大多是也都是在这里诞生的。从程序源代码到可执行文件的转化过程其实是分很多步而且是很复杂的,只是而现在的开发平台把所有的这些事情都自己承担了,给我们带来方便的同时她也隐藏了大量的实现细节。所以大多程序员只负责编写代码,其它的复杂的转换工作则由开发平台默默完成。 按照我的理解,简单的说从源代码到可执行文件的过程可分为以下几个阶段:从源代码到机器语言并将产生的机器语言按照一定的规律组织起来。我们暂且称为文件A;把文件A和运行A需要的文件B(如库函数)链接起来,形成文件A+;把文件A+装载进入内存,运行文件。(其实如果是看参考书或者其他资料的话可能不止这几步,只是这里为了简化我把它归纳为3步) 这些事形成可执行文件的关键步骤,缺一不可。现在看到被开发平台“蒙蔽”了吧。下面的部分将拨开迷雾,还你开发平台的真面目。 目标文件 在计算机领域有过一句经典的话:“any problem in computer science can be sloved by another layer of indirecition”“计算机科学领域的任何问题都可以通过增加一个中间层来解决” 比如说要实现从A到B的转换,可以先把A转换为文件A+,再把文件A+转换为我们需要的文件B。(其实在波利亚的《how to slove it》里面对这种方法也有叙述。在解题的时候可以通过增加中间层来简化问题) 那么从源代码到可执行文件的过程可以这样理解。从源代码到可执行文件也是一样的, 通过(不断的)在他们之间增加中间层,来解决问题。和上文说的, 先把源程序转化为中间文件A,再把中间文件转化为我们需要的目标文件。 在处理文件的时候就是按照这种思路来的。其实上面说的文件A更专业的说法是:目标文件。她不是可执行程序,需要和其它的目标文件进行链接、装载后才能执行。对于一个源程序, 开发平台首先要做的就是把源程序翻译成机器语言。其中很重要的一部就是编译。相信很多人都知道,就是把源代码翻译成机器语言(其实就是一堆二进制代码) 目标文件格式: 现在来看一下上面说的目标文件是如何组织的(也就是存放结构)。 起源: 想象一下如果是你来设计会如何组织这些二进制代码?就像书桌上的物品要分类放置才整洁一样,为了便于管理翻译出来的二进制代码也分类存放,把表示代码的放在一起,表示数据的放在一起。这样,二进制代码就分为了不同的块来存放。这样的一个区域就是被称为段(segment)的东西。 标准: 和计算机科学中的很多东西一样,为了方便人们的交流、程序的兼容等问题。也为这种二进制的存放方式制订了标准,于是COFF(common object file format)就诞生了。现在的windows、Linux、等主流操作系统下的目标文件格式和COFF大同小异,都可以认为是它的变种。 a.out: a.out是目标文件的默认名字。也就是说,当编译一个文件的时候,如果不对编译后的目标文件重命名,编译后就会产生一个名字为a.out的文件。具体的为什么会用这个名字这里就不在深究了。 下面的图可以让你更直观的了解目标文件: 上图是目标文件的典型结构,实际的情况可能会有所差别,但都是在这个基础上衍生出来的。 ELF文件头:即上图中的第一个段。其中的header是目标文件的头部,里面包含了这个目标文件的一些基本信息。如该文件的版本、目标机器型号、程序入口地址等等。 文本段:里面的数据主要是程序中的代码部分。数据段:程序中的数据部分,比如说变量。 重定位段:重定位段包括了文本重定位和数据重定位,里面包含了重定位信息。一般来说,代码中都会存在引用了外部的函数,或者变量的情况。既然是引用,那么这些函数、变量并没存在该目标文件内。在使用他们的时候, 就要给出他们的实际地址(这个过程发生在链接的时候)。正是这些重定位表,提供了寻找这些实际地址的信息。理解了上面之后,文本重定位和数据重定位也就不难理解了。 符号表:符号表包含了源代码中所有的符号信息 。 包括每个变量名、函数名等等。里面记录了每个符号

文档评论(0)

zefm2pj7 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档