C语言程序编译和链接

    首先要知道平时所写的代码是在编译机器上是无法直接运行的 要想将写的代码进行输出执行成结果需要通过翻译环境和执行环境最终才能输出想要的结果

    先介绍一下翻译环境  在翻译环境中源文件(.c)头文件(.h)的内容被转换成为可执行的二进制机器指令(.exe) 翻译环境可分为编译和链接两个阶段 其中编译又分为三个阶段 预处理阶段 编译阶段 汇编阶段

    这里需要注意的是多个.c⽂件单独经过编译出编译处理⽣产对应的⽬标⽂件 Windows环境下的⽬标⽂件的后缀是 .obj ,Linux环境下⽬标⽂件的后缀是 .o 多个⽬标⽂件和链接库⼀起经过链接器处理⽣成最终的可执⾏程序


    预处理阶段 源文件和头文件会变成.i的后缀文件  预处理命令 gcc -E test.c -o test.i 其中如#include#define等预编译指令会进行删除 #define删除后其中带有的宏会全部展开 #include所包含的内容也会全部展开  如#if #endif等条件编译指令会进行处理 #pragma会进行保留 所有的注释会被删除添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等
    编译阶段 将.i后缀文件变为.s的后缀文件 编译命令 gcc -S test.i -o test.s在编译过程中会进行一系列的词法分析 语法分析 语义分析以及优化

词法分析 将源文件内容通过扫描器关键字、标识符、字⾯量、特殊字符等一系列记号  

语法分析 通过语法分析器 对一系列记号生成语法树

语义分析 对内容通过语义分析器进行语义分析 可以将内容的语法错误进行报告

    汇编阶段 从.s变为.o的后缀文件 汇编的命令gcc -c test.s -o test.o 这一阶段将汇编代码变为二进制代码

链接阶段解决多文件模块相互调用的问题 地址和空间分配,符号决议和重定位等这些步骤 

这里介绍一个重定位的例子

源1 中有一个ADD函数 而源2文件中有ADD函数的外部声明和main主函数. 源2文件中的ADD虽然也会有一个地址 但属于无效地址  在符号决议中会从源1文件中ADD的有效地址代替源2中的无效地址 实现重定位 

    运行环境 将后缀为.exe的二进制机器代码存入内存中 在操作系统的环境中 一般通过操作系统完成

需要注意的是 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。

开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回
地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程
⼀直保留他们的值
执行程序从进入main开始 从终止main结束


 

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值