靜態(tài)重定位發(fā)生的具體時刻是在程序加載時。靜態(tài)重定位是指在程序運行之前,將程序中的絕對引用地址轉(zhuǎn)換為實際的物理內(nèi)存地址的過程。在現(xiàn)代的操作系統(tǒng)中,靜態(tài)重定位是由鏈接器(Linker)在程序加載時完成的。
具體的代碼示例如下:
#include <stdio.h>
// 全局變量,需要進(jìn)行靜態(tài)重定位
int global_var = 10;
// 靜態(tài)函數(shù),也需要進(jìn)行靜態(tài)重定位
static void static_func()
{
printf("This is a static function.
");
}
int main()
{
printf("Before relocation:
");
printf("Global variable: %p
", &global_var);
printf("Static function: %p
", &static_func);
// 程序加載后進(jìn)行靜態(tài)重定位
// 在這里進(jìn)行具體的重定位操作
printf("
After relocation:
");
printf("Global variable: %p
", &global_var);
printf("Static function: %p
", &static_func);
return 0;
}
登錄后復(fù)制
在上述代碼中,全局變量global_var和靜態(tài)函數(shù)static_func都需要進(jìn)行靜態(tài)重定位。在main函數(shù)中,我們首先打印這兩個變量和函數(shù)的地址,然后在程序加載后進(jìn)行具體的靜態(tài)重定位操作,最后再次打印這兩個變量和函數(shù)的地址。
靜態(tài)重定位的具體過程會因操作系統(tǒng)而異,但通常包括以下步驟:
-
確定程序加載的基地址(Base Address)。
遍歷程序的可執(zhí)行文件,找到所有的絕對引用。
將絕對引用轉(zhuǎn)換為實際的物理內(nèi)存地址,即進(jìn)行重定位。
更新程序的內(nèi)存映射表,將絕對引用地址替換為實際的物理內(nèi)存地址。
完成上述步驟后,程序中的絕對引用就被成功轉(zhuǎn)換為實際的物理內(nèi)存地址,程序便可以正常運行。
需要注意的是,靜態(tài)重定位是在程序加載時完成的,因此它只會在程序啟動時發(fā)生一次。在程序運行過程中,如果涉及到動態(tài)加載和鏈接的操作,可能會涉及到動態(tài)重定位的概念。






