動態鏈結 執行時載入dlopen

2022-08-01 08:30:10 字數 1852 閱讀 9565

前面我們在編譯可執行檔案時,如果可執行檔案要依賴某個so。必須要通過-l指定so路徑,並且-l指定so名字。

而且在可執行檔案執行時,要先載入so的load部分到程序位址空間。

有一種方式可以在編譯時不需要link so, 而且程式執行過程中去載入so。

dlopen函式可以在程序執行過程中,開啟so,將其載入到程序的位址空間,並完成初始化過程。

如果dlopen中指定的路徑是相對路徑,那麼按照ld_library_path,/etc/ld.so.cache,/lib,/usr/lib順序查詢。否則直接開啟so。

dlsym返回so的符號的值,如果符號是函式和變數,返回符號和變數的位址;如果符號是常量,就返回常量的值。

我們在前面寫的訊息佇列msgsnd.c**中稍作修改,以執行時載入libmsg.so。**如下:

#include

#include

#include

#include

#include "msg.h"

#define msg_creat_path "/mnt/hgfs/share/test/list"

#define msg_rcv_id 4

#define msg_snd_id 3

typedef int (*create_msg_queue)(const char *path, int proj_id);

typedef int (*rcv_msg)(int id, fellowmsg *msg);

typedef int (*snd_msg)(int id, fellowmsg *msg);

typedef struct _msgifmsgif;

msgif msgif;

void *fellow_listenning_msg(void *arg)

int msg_q_id = msgif.create(msg_creat_path, msg_rcv_id);

fellowmsg _fellowmsg;

while (1)

} }}

void main(void)

msgif.create = (create_msg_queue)dlsym(handle, "fellow_create_msg_queue");//獲取符號的值。

msgif.rcv = (rcv_msg)dlsym(handle, "fellow_rcv_msg");

msgif.snd = (snd_msg)dlsym(handle, "fellow_send_msg");

pthread_t thread_id;

int snd_msg_q_id = msgif.create(msg_creat_path, msg_snd_id);

printf("msgid:%d\n",snd_msg_q_id);

fellowmsg _fellowmsg;

_fellowmsg._msgtype = ctrl_cmd;

_fellowmsg._ctlinfo.u._ctlcmd = open;

_fellowmsg._ctlinfo.param = 1;

printf("create:%p, snd:%p, rcv:%p\n", msgif.create, msgif.snd,msgif.rcv);

msgif.snd(snd_msg_q_id, &_fellowmsg);

pthread_create(&thread_id, null, fellow_listenning_msg, null);

while (1)

dlclose(handle);

}那麼在編譯時我們不需要link so: gcc msgsnd.c -o msgsnd -ldl -pthread

載入時動態鏈結及執行時動態鏈結,譯自MSDN

當前目錄 系統目錄。通過getsystemdirectory 函式可以得到。16位系統目錄。沒有函式可以獲取該目錄,但它是被搜尋的。windows me 98 95 目錄不存在 windows目錄。通過getwindowsdirectory 即可得到。path環境變數中所列目錄。當應用程式呼叫loa...

靜態鏈結 裝入時動態鏈結和執行時動態鏈結

靜態鏈結 經編譯後所得到的三個目標模組a b c,他們的長度分別為 l m n。在模組a中,有 一條語句call b,用於呼叫模組b。在模組b中,有一條語句call c,用於呼叫模組c。b和c都屬於外部 對相對位址進行修改 乙個裝入程式後,模組b和c的起始位址不再是0,而是l和l m,此時需修改b和...

QML 使用ListView執行時動態載入Item

想要實現使用listview執行時動態載入item,需要兩個步驟 動態生成item 將動態生成的item插入到listview的model中 對於這兩個步驟,前者可以使用createcomponent和component.createobject實現,後者可以使用objectmodel實現,詳細內容...