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