先列出書中乙個例子的簡單**實現,以展示動態鏈結過程。
lib.h
#ifndef lib_h
#define lib_h
void foobar(int i);
#endif
lib.c
#includevoid foobar(int i)
program1.c
#include "lib.h"
int main()
program2.c
#include "lib.h"
int main()
1、將lib.c編譯成動態庫(共享物件檔案)
gcc -fpic -shared lib.so lib.c
其中:-fpic作用於編譯階段,告訴編譯器產生與位置無關**(position-independent code)。在生成的**中,全部使用相對位址,因此**可以被載入器載入到記憶體的任意位置,都可以正確的被執行。
-shared表示產生共享物件。
2、編譯鏈結兩個主程式+lib.so,生成可執行檔案
gcc -o program1 program1.c lib.so
gcc -o program2 program2.c lib.so
如下圖所示。
上述動態鏈結過程如下圖所示。
3、模組的定義
以上只是知識的搬運。
ELF動態鏈結
在現代的linux 系統中,假設乙個普通的程式會使用到 c語言靜態庫至少 1mb以上,那麼,如果我們的機器執行 100個這樣的程式,就用浪費近 100mb 的記憶體 如果磁碟有 2000 個這樣的程式,就要浪費 2gb的記憶體。靜態鏈結對程式的更新 發布等也會帶來問題。比如程式program1 使用...
動態鏈結過程
最近學習了elf檔案的格式,重點關注了動態鏈結過程中的使用到的section 第一步程式在載入時,會把直譯器程式加入到.interp段。可以解決動態庫和可執行檔案的載入。一般來講程式的載入方式是懶啟動,lazy 除非指定了ld bind now環境變數非0,那麼在程式啟動時就會把外部符號位址全部載入...
Linux下程式編譯鏈結過程
在linux下使用gcc將原始碼 c檔案 編譯成可執行檔案的過程可以分解為4個步驟,分別是預處理 prepressing 編譯 compilation 彙編 assembly 鏈結 linking i命令 gcc e hello.c o hello.i e 可以使編譯器在預處理完成後就停止編譯 o ...