Linux C C 如何使用 so動態鏈結庫?

2021-10-24 21:38:26 字數 3381 閱讀 9938

在某些時候,您可能必須在執行時載入庫才能使用其功能。 在為程式編寫某種外掛程式或模組體系結構時,這種情況最常見。

在linux c/c++語言中,載入庫非常簡單,只需呼叫dlopen,dlsym和dlclose就足夠了。

動態裝載庫api

動態庫的執行時載入時通過一系列由動態鏈結器(dynamic linker)提供的api來實現的,這幾個api的實現都是在libdl.so中的,且相關的宣告和常量定義在標頭檔案中。

下面列出了這些api:

void

*dlopen

(const

char

*filename,

int flag);/*

mode:分為這兩種

rtld_lazy 暫緩決定,等有需要時再解出符號

rtld_now 立即決定,返回前解除所有未決定的符號。

rtld_local

rtld_global 允許匯出符號

rtld_group

rtld_world

*/

void

*dlsym

(void

*handle,

const

char

*symbol)

;

int

dlclose

(void

*handle)

;

char

*dlerror

(void

);

gcc -fpic、-shared選項如果想建立乙個動態鏈結庫,可以使用 gcc 的-shared選項。輸入檔案可以是原始檔、彙編檔案或者目標檔案。

另外還得結合-fpic選項。-fpic 選項作用於編譯階段,告訴編譯器產生與位置無關**(position-independent code)。

這樣一來,產生的**中就沒有絕對位址了,全部使用相對位址,所以**可以被載入器載入到記憶體的任意位置,都可以正確的執行。這正是共享庫所要求的,共享庫被載入時,在記憶體的位置不是固定的

gcc -fpic -shared libplugin.c -o libplugin.so
例項使用 gcc 將 libshared.c 、libplugin.c 各編譯成共享物件檔案libshared.so、libplugin.so

makefile

executable: main.c libshared.so libplugin.so

$(cc)

-pie -fpic -l. main.c -lshared -ldl -o executable

libshared.so: libshared.c

$(cc)

-fpic -shared -rdynamic libshared.c -o libshared.so

libplugin.so: libplugin.c

$(cc)

-fpic -shared libplugin.c -o libplugin.so

clean:

rm -f executable libshared.so libplugin.so testcase.zip

run: executable

./run.sh

zip: executable

rm -f testcase.zip

zip testcase.zip executable libshared.so libplugin.so run.sh

.phony: run clean zip

libplugin.c它有乙個簡單的函式呼叫extern函式libshared_get_value()。它不針對鏈結libshared.so

#include

extern

intlibshared_get_value()

;void

plugin_function()

libshared.c其中包含功能libshared_get_value()。它是作為名為的共享庫構建的libshared.so。

int

libshared_get_value()

使用sh run.sh執行可執行檔案。

ld_library_path=..

/executable

main.c與libshared.so和鏈結libshared_get_value()。

我們使用dlopen開啟乙個.so,並將其載入到程序的位址空間,完成初始化過程。當庫被裝入後,可以把 dlopen() 返回的控制代碼作為給 dlsym() 的第乙個引數,以獲得符號在庫中的位址。使用這個位址,就可以獲得庫中特定函式的指標,並且呼叫裝載庫中的相應函式。

總結

上面我們使用dlopen、dlsym、dlclose載入動態鏈結庫,為了使程式方便擴充套件,具備通用性,可以採用外掛程式形式,這種情況在開發中最常見。

而linux 下動態鏈結庫的檔案字尾為.so,它是一種特殊的目標檔案,可以在程式執行時被載入進來。

Linux 動態庫 so 使用

折騰了會 dll 覺得不爽,改玩 so 去 一.編寫個c檔案 test.c include file test.c int say int add int x,int y 二.編譯成動態庫 so gcc shared o test.so test.c usr lib gcc x86 64 pc li...

Linux C C 生成並使用靜態庫 動態庫

在windows下靜態庫的字尾為 lib 動態庫字尾為 dll 而在linux下靜態庫的字尾為 a 動態庫的字尾為 so。那麼什麼是靜態庫呢?在我們的專案開發中,有些 會被反覆使用,那麼這時我們便可將這些 編譯成庫的形式來呼叫,像靜態庫就是在可執行檔案中包含庫 的乙份完整拷貝,但這種方式有個很嚴重的...

動態除錯so

1.找乙個root過的手機,把ida pro 安裝目錄下的android server 放到 手機根目錄下 data裡面,要注意的是,即便是root過的手機,data這個目錄對外也只是唯讀的許可權,所以必須要調公升許可權才可以,如果手機用的就是re 檔案管理器的話,那就最好了,直接可以操作.2,這個...