预热姿势
1.地址空间:
一个比较抽象的概念,可以想象成一个数组,里面的每个元素是一个字节,
大小由地址长度决定。32位地址空间大小就是2^32 = 4GB.
分为虚拟地址空间(Virtual),和物理地址空间(Physical)。
2.四个过程:
1. 预处理(Prepressing):展开宏,处理所有预编译指令,删除注释,添加行号,文件名保留#pragma指令
2. 编译(Compilation): 词法,语法,语义分析,产生相应的汇编代码。
3. 汇编(Assembly): 汇编代码转为机器指令(目标文件 .o文件)
4. 链接(Linking): 和其他库,生成可执行文件。
3.目标文件:
编译器编译源代码后生成的文件 叫做目标文件。也叫模块。
Windows的.obj, Linux下的.o
4.重定位:
两个目标文件链接后,一个目标文件里面修正另一个目标文件的指令的目标地址。
(绝对地址 指向 正确的地址)
5.目标文件/可执行文件格式:
目标文件和可执行文件的内容和结构很相似,
所以一般目标文件和可执行文件采用一种格式存储。
Windows下可执行文件格式:PE(Portable Executable) (.exe)
Linux的可执行文件:ELF(Executable Linkable Format)
两者都是COFF(Common File Format) 格式
动态链接库(DLL Dynamic Linking Library)(win的.dll, Linux的.so)
静态链接库(Static Linking Library) (win的.lib, Linux的 .a) (多个目标文件的文件包)
这两个也都是按照可执行文件来存储的。
6.符号(Symbol)
在链接中,目标文件之间 相互拼合,实际上市目标文件之间对地址的引用。
即对函数和变量的地址的引用。
每个函数或变量都有自己独特的名字,在链接中,函数和变量统称符号。
函数名和变量名就是符号名
每个目标文件都有一个相应的符号表,里面记录了目标文件中用到的所有符号。
每个定义的符号都有一个对应的值,叫做符号值(函数、变量的地址)。
7.extern "C"
extern "C" {
int func(int);
int var;
}
编译器会将 大括号内的代码当作C语言代码处理,即本语言的符号修饰机制不会起作用。
extern "C" int var2; 单独定义变量为C语言的符号。