程序编译过程

作者 : 开心源码 本文共567个字,预计阅读时间需要2分钟 发布时间: 2022-05-12 共173人阅读

程序编译过程

程序编译流程

预解决主要是解决以“#”号开头的命令,包括宏定义、文件包含、条件编译。

编译的时候会检测语法、函数、变量的公告等情况,有错误则立即报错;经过编译器将c程序编译成汇编程序后,再经过汇编器将会汇编程序编译成.o文件。

链接器就是将.o文件与外部的.a库、.lds链接脚本等文件进行编译生成可执行文件.elf、.out。

可执行文件一般还需要转换工具(objcopy)转换成二进制文件.bin、.hex等

可执行程序对数据的存储包括BSS段、数据段、代码段,这些段在.lds链接脚本里面会定义。

  • BSS段:存放未初始化的全局变量和静态变量,默认这些值都为0,可读写;
  • 数据段:存放已初始化的全局变量和静态变量,可读写;
  • 代码段:存放可执行代码的位置,一般为只读。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或者缩减。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态增加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈, 存放程序的局部变量(但不包括static公告的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。因为栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。

memory

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 程序编译过程

发表回复