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文件中不知道引用的外部变量和函数的定义具体信息,不知道具体地址。而链接过程中知道了函数是在哪里定义,怎么定义的。所以之后分配了虚拟内存地址。就可以执行了。

 

posted @ 2022-05-23 22:08  丁庄主啊  阅读(3189)  评论(0编辑  收藏  举报