深入理解计算机系统之静态库的链接运行(0)

最近的工作是为iOS平台封装算法库,借此机会在周末复习修炼一下“内功”,将深入理解计算机系统相关章节进行复习。

先看一段最简单的C语言代码:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

我们追踪这段程序运行的声明周期来开始系统的学习。

这段程序的声明周期是从一个源程序或者说源文件开始的,源程序实际上就是一个由值0和1组成的位,8个位被组成一组,称为字节。每个字节表示程序中的某些文本字符。

大部分现代计算机系统都使用ASCII标准来表示文本字符,这种方式实际上就是用一个唯一的单字节大小的整数值来表示每一个字符。

上述代码程序是以字节序列的方式存储在文件中的。每个字节都有一个整数值(换行符也对应整数值,值为10),像这样只由ASCII字符构成的文件称为文本文件,所有其它文件都成为二进制文件

系统中所有的信息包括磁盘文件,内存中的程序,内存中的程序,内存中存放的用户数据以及网络上传送的数据,都是由一串比特来表示的,区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。

上述代码程序的声明周期是从一个高级C语言程序开始的,为了在系统上运行这个程序,每条语句必须被其它程序转化为一系列低级的机器语言指令,然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件形式存放起来,目标程序也成为可执行目标文件

如上图,从源文件到目标文件的转化是由编译器驱动程序完成的。

gcc编译器驱动程序读取源程序文件,并把它翻译成一个可执行目标文件hello,这个翻译过程可分为四个阶段完成,执行这四个阶段程序(预处理器编译器汇编器链接器)一起构成了编译系统。 

预处理阶段:预处理器根据以#开头的命令,修改原始的C程序,比如#include<stdio.h>并把它直接插入程序文本中。结果就得到了另一个C程序,通常是以.i作为扩展名。

编译阶段:编译器将.i文本文件翻译成文本文件.s,它包含一个汇编语言程序。

汇编阶段:汇编器将.s文件翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序,并将结果保存在目标文件hello.o

,此文件是一个二进制文件.如果我们在文本编辑器中打开.o文件,将看到一堆乱码。

链接阶段:此程序调用了printf函数,它是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了得目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中,链接器,就负责处理这种合并,结果就是得到hello文件,它是一个可执行目标文件,可以被加载到内存中,由系统执行

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值