gcc fPIC選項和動態鏈結的要求

2021-08-26 23:49:22 字數 1055 閱讀 3935

使用 -fpic 選項,會生成 pic **。.so 要求為 pic,以達到動態鏈結的目的,否則,無法實現動態鏈結。

non-pic 與 pic **的區別主要在於 access global data, jump label 的不同。

比如一條 access global data 的指令,

non-pic 的形勢是:ld r3, var1

pic 的形式則是:ld r3, var1-offset@got,意思是從 got 表的 index 為 var1-offset 的地方處

指示的位址處裝載乙個值,即 var1-offset@got 處的4個 byte 其實就是 var1 的位址。這個位址只有在執行的時候才知道,

是由 dynamic-loader(ld-linux.so) 填進去的。

再比如 jump label 指令

non-pic 的形勢是:jump printf ,意思是呼叫 printf。

pic 的形式則是:jump printf-offset@got,意思是跳到 got 表的 index 為 printf-offset 的地方處

指示的位址去執行,這個位址處的**擺放在 .plt section,每個外部函式對應一段這樣的**,其功能是呼叫

dynamic-loader(ld-linux.so) 來查詢函式的位址(本例中是 printf),然後將其位址寫到 got 表的 index 為 printf-offset 的地方,

同時執行這個函式。這樣,第2次呼叫 printf 的時候,就會直接跳到 printf 的位址,而不必再查詢了。

got 是 data section, 是乙個 table, 除專用的幾個 entry,每個 entry 的內容可以再執行的時候修改;

plt 是 text section, 是一段一段的 code,執行中不需要修改。

每個 target 實現 pic 的機制不同,但大同小異。比如 mips 沒有 .plt, 而是叫 .stub,功能和 .plt 一樣。

可見,動態鏈結執行很複雜,比靜態鏈結執行時間長;但是,極大的節省了 size,pic 和動態鏈結技術是計算機發展史上非常重要的乙個里程碑。

靜態鏈結和動態鏈結

靜態載入dll dll工程b 專案屬性 配置屬性 常規 配置型別 動態庫 dll 在宣告檔案中,宣告匯出函式 declspec dllexport int xx 如果是c檔案,要在c 檔案中被呼叫,註明extern c 可以 ifdef cplusplus extern c endif 呼叫dll的...

靜態鏈結和動態鏈結

1 靜態鏈結庫只包含 lib檔案 動態鏈結庫包含 lib檔案和dll檔案,靜態鏈結庫中不能再包含其他的動態鏈結庫或者靜態庫,而在動態鏈結庫中還可以再包含其他的動態或靜態鏈結庫。此外他們都會用到定義了函式和相關資料結構的.h標頭檔案,其中 h標頭檔案是編譯時必須的,lib是鏈結時需要的,dll是執行時...

靜態鏈結和動態鏈結

動態鏈結庫 靜態庫 import庫區別 windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll,kernel32.dll,它包含用於管理記憶體 程序和執行緒的各個函式 user32.dll,它包含用於執行使用者介面任務 如視窗的建立和訊息的傳送 的各...