linux下ELF的動態鏈結過程

2021-09-19 15:31:24 字數 1017 閱讀 4647

先列出書中乙個例子的簡單**實現,以展示動態鏈結過程。

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 ...