专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
51CTO技术栈  ·  突发!刚被OpenAI收购就惨遭Claude ... ·  昨天  
稀土掘金技术社区  ·  掘金 AI 编程社区- 人人都是 AI 编程家竞赛 ·  5 天前  
稀土掘金技术社区  ·  为了让 iframe 支持 ... ·  3 天前  
51好读  ›  专栏  ›  程序员大咖

从Hello World说程序运行机制

程序员大咖  · 公众号  · 程序员  · 2017-04-03 20:00

正文

请到「今天看啥」查看全文


目标文件格式:
现在来看一下上面说的目标文件是如何组织的(也就是存放结构)。

起源:
想象一下如果是你来设计会如何组织这些二进制代码?就像书桌上的物品要分类放置才整洁一样,为了便于管理翻译出来的二进制代码也分类存放,把表示代码的放在一起,表示数据的放在一起。这样,二进制代码就分为了不同的块来存放。这样的一个区域就是被称为段(segment)的东西。

标准:
和计算机科学中的很多东西一样,为了方便人们的交流、程序的兼容等问题。也为这种二进 制的存放方式制订了标准,于是COFF(common object file format)就诞生了。现在的windows、Linux、等主流操作系统下的目标文件格式和COFF大同小异,都可以认为是它的变种。

a.out:
a.out是目标文件的默认名字。也就是说,当编译一个文件的时候,如果不对编译后的目标文件重命名,编译后就会产生一个名字为a.out的文件。具体的为什么会用这个名字这里就不在深究了。有兴趣的可以自己google。

下面的图可以让你更直观的了解目标文件:

上图是目标文件的典型结构,实际的情况可能会有所差别,但都是在这个基础上衍生出来的。

ELF文件头: 即上图中的第一个段。其中的header是目标文件的头部,里面包含了这个目标文件的一些基本信息。如该文件的版本、目标机器型号、程序入口地址等等。

文本段: 里面的数据主要是程序中的代码部分。

数据段: 程序中的数据部分,比如说变量。

重定位段:

重定位段包括了文本重定位和数据重定位,里面包含了重定位信息。一般来说,代码中都会存在引用了外部的函数,或者变量的情况。既然是引用,那么这些函数、变量并没存在该目标文件内。在使用他们的时候, 就要给出他们的实际地址(这个过程发生在链接的时候)。正是这些重定位表,提供了寻找这些实际地址的信息。理解了上面之后,文本重定位和数据重定位也就不难理解了。

符号表: 符号表包含了源代码中所有的符号信息 。 包括每个变量名、函数名等等。里面记录了每个符号的信息,比如说代码中有“student”这个符号,对应的在符号表中就包括这个符号的信息。包括这个符号所在的段、它的属性(读写权限)等相关信息。

其实符号表最初的来源可以说是在编译的词法分析阶段。在做词法分析的时候,就把代码中的每个符号及其属性都记录在符号表中。

字符串表: 和符号表差不多的功能,存放了一些字符串信息。
其中还有一点要说吗的是:目标文件都是以二进制来存储的,它本身就是二进制文件。
现实中的目标文件会比这个模型要复杂些,但是它的思路都是一样的,就是按照类型来存储,再加上一些描述目标文件信息的段和链接中需要的信息。

a.out剖分

Hello World

空口无凭,我们现在就来研究一下hello world编译后形成的目标文件,这里用 C 来描述。

简单的hellow world 源码:

/*hello.c*/

#include







请到「今天看啥」查看全文