【静态链接】第1章---------------------概述

来源:互联网 发布:站长之家软件下载 编辑:程序博客网 时间:2024/05/29 19:49

 

########  该系列博文为书籍《程序员的自我修养》的笔记 ##########

 

 

【说明】

             我们在linux下学hello world时候,是直接用GCC编译,然后运行的,但是,要从源代码 到可执行文件显然不是一件容易的事,GCC到底都干了些什么呢,这一节,我们简单介绍从源代码到可执行文件的要经过哪些步骤!

 

【预处理】

               还记得C语言教科书中对#include  的介绍吗,没错,这个预处理命令就是把后面的文件复制到当前位置。

               预处理处理那些源代码中以#开头的指令,比如#include  #define 等等,处理后的文件后缀名是.ic++是.ii),主要干以下事情

                       1)删除#define 扩展所有的宏定义,正如C教科书说的

                       2)处理条件编译语句 "#if"    "#endif" 等等

                       3)递归得包含#include 后面的文件,也就是说也就是被包含的文件如果也有#include 指令也要插入相应的文件哦

                       4)删除所有注释, 反正编译器又看不懂注释。。。。

                       5#pragma 指令需要保留,给编译器用的

 

【编译与汇编】

               编译就是把用源文件生成汇编代码,其实也不单单是汇编代码,里边也包含了一些信息给后面的过程使用,至于编译的原理,我想学计算机的都知道它是很复杂的,这里只是简单介绍一下一般编译分为哪些过程,要想深入学习编译原理,推荐看传说中的龙书《编译原理》,汇编就是生成机器码了

                        

                       1)词法分析:利用有限状态机算法,将源代码字符序列分割成一系列的记号,比如关键字,标示符等等

                       2)语法分析:利用上下文无关语法对记号进行语法分析,产生语法树

                       3)语义分析:语法分析仅仅完成对表达式语法层面的分析,不了解这个语句是否真正有意思,语义分析给语法树加上类型

                       4)中间语言生成:它将语法树换成中间代码,这样编译器可以分为前端和后端,前端负责产生机器无关的中间码,后端再转换成机器码,这样可以方便优化

                       5)目标代码生成和优化:将中间语言转换成目标代码,并加以优化,这一步和体系相关

 

【链接】

                 链接就是把一些模块组合起来生成一个可执行文件,它的原理也很复杂,是我们学习的重点,后面大部分是将链接的,不过还包含一些库的内容

                 链接的主要过程包括 地址和空间分配,符号决议,重定位

                

                

 

                    1)里边的.o文件称为“目标文件”,也叫“模块”

                   

 

0 0
原创粉丝点击