我知道C内存布局和二进制形成过程.我对有关何时以及谁为全局变量分配地址的阶段有疑问/疑问.
extern int dummy; //Declared in some other file
int * pTest = &dummy;
Run Code Online (Sandbox Code Playgroud)
这段代码汇编得很好.只有在为其分配地址时,pTest才会有虚拟地址.我想知道虚拟变量在哪个阶段(编译或链接器)获取地址?
编译器说:
int *pTest = &<where is dummy?>;
Run Code Online (Sandbox Code Playgroud)
链接器说:
int *pTest= &<dummy is here>;
Run Code Online (Sandbox Code Playgroud)
装载机说:
int *pTest= <dummy is at 0x1234>;
Run Code Online (Sandbox Code Playgroud)
这种稍微简化的解释试图传达以下内容:
编译器识别外部变量dummy被用于
链接器标识此变量所在的位置和模块
但只有将可执行程序放入内存后,才会知道变量的实际位置,并且加载器会将此实际地址放在所有dummy使用的位置.