
编译、链接与装载
sicofield
这个作者很懒,什么都没留下…
展开
-
编译过程
由程序生成可执行文件经过了预编译——编译——汇编——链接的过程。其中编译的步骤分为:词法分析、语法分析、语义分析、中间语言生成、目标代码生成及优化(如下图)。 例子:array[index] = (index + 4) * (2 +6) 首先是词法分析形成一个个的记号,之后进行语法分析产生语法树。 接下来进行语义分析,编译器所能分析的语义是静态语义,所谓原创 2013-05-22 10:21:45 · 1441 阅读 · 0 评论 -
静态链接
目标文件中有不同的段,主要有代码段,数据段,bss段(bss段为未初始化的变量预留了空间,记录了各变量所需的大小,但是在文件中是不占用大小的)。 在目标文件中与链接有关的就是重定位表(段)。对于每个需要重定位的代码段或数据段都会存在一个重定位表,如果代码段中有针对绝对地址的引用就会存在代码段重定位表——.rel.text,同样相对与数据段的重定位表——.rel.data。原创 2013-05-22 19:49:21 · 1275 阅读 · 0 评论 -
动态链接
1.为什么要动态链接 静态链接有两大缺陷: ①浪费内存和存储空间。 因为各个可执行文件可能会调用相同的库函数及它们所需要的辅助数据结构。假设有两个目标文件Program1.o和Program2.o,都需要和lib.o进行链接形成可执行文件,当用动态链接的时候内存中只需要存在一份lib.so就可以了。 ②模块更新困难。 因为当可执行文件中的一个模块原创 2013-05-24 13:25:45 · 1466 阅读 · 0 评论 -
内存管理
1.进程地址空间分布 下图是linux系统中进程地址空间布局,windows进程地址空间布局与此类似。 2.栈与函数调用 在经典的操作系统里,栈总是向下增长的。在i386下,栈顶由称为esp(stack pointer)的寄存器进行定位。i386中,一个函数的活动记录用ebp和esp这两个寄存器划定范围。esp始终指向栈的顶部,同时原创 2013-05-27 20:22:05 · 1056 阅读 · 0 评论