摘要: 这篇博文由一个 bug 引出了编译链接的整个过程。我们可以看到一个源代码文件最终变成一个可执行文件中间经历了编译和链接两个过程,编译过程又分为预编译,编译,和汇编;预编译阶段主要处理#开头的代码,编译则是进行一些语法分析和优化,最终生成汇编代码,而汇编则是生成机器代码,同时将源文件通过一个叫做可重定位目标文件进行保存。这个可重定位目标文件里面有一个段,叫做符号表段,里面存储了当前源文件的符号(主要是函数,以及一些全局变量)。之后链接过程会分为合并,符号解析,重定位三个阶段。合并主要就是合并.text,.data, .bss段等,其中符号表段合并时由于不同文件之间可能会有一些重名的符号,因此在这一步可能会触发一些隐晦的 bug,重定位则是根据最终合并后的一些数据和函数的地址,将对应的机器码调用地址进行修改。 阅读全文
posted @ 2024-09-04 15:54 CuriosityWang 阅读(8) 评论(0) 推荐(0) 编辑