c语言.o文件以及.o文件的链接
g++ -c name.cpp将文件编译成为了.o文件(期间经历了预编译,编译,汇编3阶段)
上图就是我们的.o文件的逻辑存储(格式)
通常,栈中的代码(也就是函数),会被编译成一条条的汇编指令放在.text区。.rodata区是存储常量的。
其中最难理解的是符号,符号放在.symtab中。
符号可以理解为方便接下来链接操作的辅助标记?
全局变量,静态变量,函数,这三个会生成符号,存放在.symtab中。
若是这些变量和函数不是在当前文件内定义的,则会标记为undef.
接下来,多个.o文件可以开始链接。
其实就是多个c文件的目标文件每个区域的合并(.text与.text,以此类推),然后就可以根据合并后的.o文件找到外部引用的函数的所在文件位置(就是在这个过程中检查出了coder写的代码是否有重定义或者未定义的),最后就可以分配虚拟内存地址了。如下
最后就得到我们的.out文件(windows上是.exe文件),其实最后的可执行文件也是以类似于.o文件的格式组织的。那为什么.o文件不能执行呢?因为.o文件中不知道引用的外部变量和函数的定义具体信息,不知道具体地址。而链接过程中知道了函数是在哪里定义,怎么定义的。所以之后分配了虚拟内存地址。就可以执行了。