共享庫的高階特性

2021-08-08 21:47:19 字數 2296 閱讀 3982

一般用於實現外掛程式功能,可通過呼叫函式來載入、解除安裝共享庫。可以查詢共享庫中函式名、變數名所對應的指標。

# include 

void *dlopen(const

char *libfilename, int flags); //開啟共享庫

int dlclose(void *handle); //關閉共享庫

const

char *dlerror(void); //返回錯誤字串

void *dlsym(void *handle, char *symbol); //查詢共享庫中的符號

void *dlopen(const

char *libfilename, int flags);

rtld_global:這個共享庫中解析的函式符號可以被後面開啟的庫使用

rtld_local:這個共享庫中解析的函式符號不能被後面開啟的庫使用

:以上兩個選項為共享庫的使用範圍

rtld_nodelete:不解除安裝共享庫,即使dlclose()後引用計數為0。此時,dlopen()不會重新初始化庫中靜態變數(glibc2.2可用)

rtld_noload:不載入共享庫,作用1:可用與測試共享庫是否被載入,如果載入返回共享庫控制代碼,不載入返回null。作用2:可再已開啟的共享庫上新增新的flags。(glibc2.2可用)

rtld_deepbind:解析庫中符號引用時,先搜尋庫中的定義,如果庫中沒有,再搜尋全域性定義。(這個很有用,可無腦加上,glibc2.3.4可用)

int dlclose(void *handle);
const

char *dlerror(void);

void *dlsym(void *handle, char *symbol);
void *handle:共享庫控制代碼

char *symbol:符號名稱(函式名、變數名)

root@jing-virtualbox

:~# ls

a.out libt.so main.c t.c

root@jing-virtualbox

:~# cat t.c #有點懶,並沒有寫t.c的標頭檔案。。。

# include

void f()

root@jing-virtualbox

:~# cat main.c

# include

# include

int main(void)

void (*f)() = dlsym(hander, "f");

f(); //呼叫函式f

dlclose(hander);

return0;}

root@jing-virtualbox

:~# gcc main.c -ldl

root@jing-virtualbox

:~# ./a.out

lib t

作用:確保聯結器只匯出指定符號。

gcc -shared a.o b.o c.o -o libabc.so -wl,--version-script,scriptfile.map
-wl,–version-script,scriptfile.map:指定乙個指令碼,規定可以匯出的符號,指令碼如下

global: # 可以被載入的符號

f_a;

f_b;

f_c;

local:

*; #*表示除global之外的所有符號

};

初始化函式會在共享庫載入的時候自動執行,終止函式會在共享庫解除安裝的時候自動執行,**如下。

void __attribute__ ((constructor)) 初始化函式名(void)

void __attribute__

((destructor)) 終止函式名(void)

:以上均出自 linux/unix系統程式設計手冊,只選了感覺有用的。

資料庫高階特性

觸發器模板 create trigger trigger name trigger time trigger event on table name for each row trigger statementtrigger name 是觸發器的名字 trigger time 是觸發時間選項 bef...

資料庫的高階SQL特性

一 約束 1 唯一約束 唯一約束用來保證乙個列中的資料唯一,他們和主鍵的區別是 2 檢查約束 檢查約束用來保證乙個列中的資料滿足一組指定的條件,常見用途是 以下對order表施加了乙個檢查約束,保證所有物品的數量大於0 create table order 二 索引 資料庫表的主鍵總是排序的,我們可...

資料庫高階特性(索引)

索引的概念 索引是一種特殊的檔案,他們包含著對資料表裡面所有記錄的引用指標,它是對資料庫庫表中一列或多列的值進行排序的一種結構。簡單來說資料庫索引就是一本書前面的目錄,能夠加快對資料庫的查詢速度,資料庫索引就是為了提高表的搜尋效率而對某些欄位的值建立目錄。為什麼要建立索引?1 建立索引的目的就是加快...