連結器與載入器與執行檔格式

對目的檔進行反組譯時,發現呼叫外部函式printf之指令的跳躍目標是0這樣的暫時值。這個值會在何時被正確填入?

  1. A這是編譯器的錯誤,不修正原始碼就無法填入
  2. BCPU在執行指令的瞬間,推測並決定跳躍目標
  3. C在連結時(若為動態連結,則一部分在執行時)依據重定位資訊填入
查看答案與解析

正確答案:C. 在連結時(若為動態連結,則一部分在執行時)依據重定位資訊填入

編譯的時點並不知道printf的位址,所以編譯器會將跳躍目標設為暫時值,並留下「在這個指令的這個欄位填入printf的位址」的重定位資訊。連結器會依此寫入正確的值。若是動態連結,則會改寫為指向PLT的入口,而實際的函式庫函式位址由動態連結器在執行時填入GOT。

  • A. 這不是錯誤,而是以重定位為前提的正常狀態。
  • B. CPU不會推測並決定跳躍目標。
  • C. 正確。暫時值是正常的狀態。
練習這個領域 前往領域頁面

連結器與載入器與執行檔格式的其他題目

  1. 關於嵌入式開發中使用的連結器腳本(linker script)的功用,下列何者正確?
  2. 在沒有作業系統的微控制器上,通電後啟動程式碼在呼叫main之前所進行的處理,下列何者正確?
  3. 關於ELF檔案中的「區段(section)」與「段(segment)」的差異,下列何者正確?
  4. 藉由不讓記憶體分頁同時具備「可寫入」與「可執行」(W^X,寫入與執行分離),較容易防禦的攻擊為下列何者?
  5. 在Linux的共用函式庫中,將libfoo.so.1的「.1」這類soname的版本號碼調高,一般是在什麼時候?

這個領域的比較