作为刚毕业没多久的非计算机学院出身的工科生,误打误撞的变成一个程序猿,因基础知识很薄弱,在此记录一些学习的过程。
在项目开发过程中,经常遇到一些编译链接的问题,对此一知半解的,查阅一些资料,记录一下。
当我们写了一段简单的C程序时,怎么让他变成可执行的文件的过程,就是编译和链接。编译的过程可分为几个步骤:
1、 预处理,我们在程序写程序的过程中,经常会用到一些预处理的指令,比如:#define #ifdef #else #endif 等等。这些预处理指令会在预处理阶段被替换成实际的代码。
2、 编译,检查和校验预处理之后的代码,将其翻译成汇编代码;再通过汇编器生成中间目标文件(.o / .obj)。大部分程序编写出错都会出现在这个阶段。(在此建议告警也一并消除,能避免很多问题)。
3、 链接,主要是链接函数和全局变量及一些定义的静态变量;如果需要调用静态库或者动态库的情况,也会在此时链接(动态库还需分情况),最后会生成一个可执行文件,此文件就可以运行了。主要完成了地址和空间的分配。
程序生成可执行文件时,会按照上图方式区分:代码指令本身会在代码段,正常情况下,可读不可写。堆、栈的大小会在程序执行时动态调整。静态或者全局变量已初始化的会在数据段;未初始化的静态或全局变量被分配再bss段;数据段和bss段是静态内存分配。Bss段只记录了变量的大小,未占用文件空间,是在程序执行时分配的,由系统初始化。bss段在初始化时,内存会被清0,而在堆栈上分配的内存或者局部变量创建时,该值不一定为0。