一文教你如何構建動態鏈結庫

2021-10-04 03:32:41 字數 2282 閱讀 1603

話說前一篇文章一文教你如何構建靜態鏈結庫向大家介紹了如何構建靜態庫,雖然解決了我們的一**煩,但靜態庫在使用中任然存在一些缺點。

動態鏈結庫又叫共享庫(shared object)就可以解決以上問題。它其實是乙個目標模組,在執行或載入時,可以載入到任意的記憶體位址,並和正在執行在記憶體中的程式鏈結起來。它是由乙個叫做動態鏈結器的程式來執行的。在linux系統中,用.so字尾來表示共享庫,在windows下用dll來表示。

說了這麼多,那到底怎麼建立和使用自己的共享庫呢?

需求:將c檔案addvec.c和mulvec.c編進乙個名叫libvector.so的共享庫。並在之後的main2.c檔案中呼叫該庫中的addvec()函式。

gcc -shared -fpic -o libvector.so addvec.c  mulvec.c
gcc  -o prog2l main2.c .

/libvector.so

此時,在建立可執行檔案prog2l時,並沒有將共享庫中的**和資料複製進去,而僅僅是複製了一些重定位資訊和符號表資訊。只有等到載入器execve載入可執行目標檔案時,這時動態鏈結器才會依次將libc.so以及libvector.so的**和資料複製到記憶體段中供prog2l程序呼叫。

看圖☞

前面我們已經**了應用程式在載入後執行前,動態鏈結器載入和鏈結動態庫的過程。然而,應用程式還可以在它執行時呼叫動態載入器來載入和鏈結某個共享庫,而無需在編譯時鏈結。

#include void *dlopen(const char *libname, int flag);

//成功則返回指向庫的控制代碼的指標,失敗返回null

libname:需要載入和鏈結的動態庫路徑名;

flag:指示鏈結器解析外部符號的時間點(必須選則立即或推遲中的乙個),rtld_now(載入時立即解析)或rtld_lazy(推遲到執行時解析);rtld_global(用其它已用rtld_global引數開啟了的庫解析當前庫的外部符號),可以與之前兩個標誌中的乙個取或。

#include void *dlsym(void *handle, char *symbol);

//成功則返回指向符號的指標,失敗返回null

handle:乙個dlopen函式返回的庫的控制代碼的指標

symbol:庫中某個符號(函式名或變數名)

#include void *dlsym(void *handle);

//成功則返回0,失敗返回-1

如果沒有其它共享庫還在使用這個庫,就解除安裝handle指向的共享庫

#include const char *dlerror(void);

//如果之前對dlopen及dlsym或dlclose的呼叫失敗,

//則返回指向一條錯誤訊息字串的指標,如果都呼叫成功則返回null

下面展示一段dll.c檔案,它可以在執行時利用該介面動態鏈結共享庫libvector.so,並呼叫其中的addvec函式。

#include

#include

#include

int x[2]

=;int y[2]

=;int z[2]

;int

main()

if(!(addvec =

dlsym

(handle,

"addvec"))

)addvec

(x, y, z,2)

;printf

("z = [%d %d]\n"

, z[0]

, z[1]

);if(

(dlclose

(handle)))

return0;

}

如果要編譯這個程式,我們可以利用下面的方式呼叫gcc:

gcc -rdynamic -o prog2r dll.c -ldl
嵌入式linux&arm

csdn部落格

一文教你如何解讀Vintage

當我們在觀測資產最終損失和不同資產的風險差異時,經常會用到乙個指標,那就是vintage。這個指標的計算和展示與大多數指標有所不同,因為所需要的資料資訊並不單 於某乙個固定時間的切片資料,而是 於歷史多個時間節點的切片資料,所以它也攜帶了歷史資訊。vintage本身攜帶了這麼多資訊,我們該如何挖掘呢...

一文教你玩轉git

首先進入乙個目錄之後,使用這個命令是先初始化乙個git倉庫 git init 它會預設建立乙個名為master的分支 下面這個用於檢視是否有修改的檔案,如果有就會報紅 git status 下面這個用於檢視檔案修改的細節 git diff test.txt 下面這個是提交到暫存區 git add t...

一文教你看懂原型!!!

談到原型,我們都知道最重要的兩個屬性就是 proto 和prototype,那麼他們到底有什麼關係又到底是什麼呢,這一篇看完相信你就會有一些理解了。js中萬物皆物件,每個資料都會有乙個 proto 的屬性,這個屬性叫隱式原型。乙個物件 obj 的 隱式原型 proto 指向構造該物件 obj 的 建...