前面我們在編譯可執行檔案時,如果可執行檔案要依賴某個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實現,詳細內容...