連結器與載入器與執行檔格式
對目的檔進行反組譯時,發現呼叫外部函式printf之指令的跳躍目標是0這樣的暫時值。這個值會在何時被正確填入?
- A這是編譯器的錯誤,不修正原始碼就無法填入
- BCPU在執行指令的瞬間,推測並決定跳躍目標
- C在連結時(若為動態連結,則一部分在執行時)依據重定位資訊填入
查看答案與解析
正確答案:C. 在連結時(若為動態連結,則一部分在執行時)依據重定位資訊填入
編譯的時點並不知道printf的位址,所以編譯器會將跳躍目標設為暫時值,並留下「在這個指令的這個欄位填入printf的位址」的重定位資訊。連結器會依此寫入正確的值。若是動態連結,則會改寫為指向PLT的入口,而實際的函式庫函式位址由動態連結器在執行時填入GOT。
- A. 這不是錯誤,而是以重定位為前提的正常狀態。
- B. CPU不會推測並決定跳躍目標。
- C. 正確。暫時值是正常的狀態。