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

使用GNU連結器時,若像「gcc -lmylib main.o」這樣,將靜態函式庫寫在使用它的目的檔之前,有時會出現未定義參照的錯誤。下列關於其原因的敘述何者正確?

  1. A因為連結器從左到右依序處理,讀取函式庫的時點上尚未被參照的函式不會被取出
  2. B因為規定函式庫必須且只能寫在指令的最後一個
  3. C因為將函式庫寫在前面,函式庫的內容會被清除
查看答案與解析

正確答案:A. 因為連結器從左到右依序處理,讀取函式庫的時點上尚未被參照的函式不會被取出

GNU連結器依命令列上所寫的順序處理檔案,遇到靜態函式庫時,只會取出能解決「尚未找到定義的參照」的目的檔。若先寫函式庫,在那個時點main.o的參照還不存在,所以什麼都不會取出,之後再讀取main.o也不會回頭尋找。因此原則上函式庫要寫在使用它的一方之後。

  • A. 正確。順序是有意義的。
  • B. 函式庫可以寫多個。
  • C. 函式庫的內容不會消失。
練習這個領域 前往領域頁面

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

  1. 關於位置獨立程式碼(PIC),下列說明何者正確?
  2. 關於共用函式庫所使用的GOT(全域偏移表,Global Offset Table)的功用,下列何者正確?
  3. 在動態連結中,使用PLT(程序連結表,Procedure Linkage Table)進行延遲繫結(lazy binding)時,下列說明何者正確?
  4. 在Linux等系統中啟動動態連結的程式時,動態連結器(ld.so等)的功用,下列何者正確?
  5. 關於ASLR(位址空間配置隨機化)的目的,下列何者正確?

這個領域的比較