大家是不是總是鬱悶,要在指令碼中訪問資料庫,就又要重新編譯一次指令碼引擎,寫一堆的介面來來讓指令碼可以訪問資料庫,或者又碰到要在指令碼中訪問網路,又要重新編譯一次指令碼引擎,寫一堆的介面。每增加一次新東西,都需要重新修改指令碼引擎,是不是很麻煩呢?
其實有個簡單的方法,直接讓你的指令碼引擎支援動態鏈結庫即可。
首先,我們知道,訪問動態鏈結庫有兩種方法,一種是在連線的時候指定,另外一種則是在執行中指定。為了能讓指令碼引擎直接的訪問任何動態鏈結庫,我們可以使用在執行中指定的方法。linux下也好,windows下也好,最多都只能通過函式名獲取到乙個函式指標,但是對於指令碼來說,卻不知道函式的定義,無法對其進行呼叫。
那麼我們用下面的方法(以linux下為例子,windows平台下類似,僅api不同):
比如說有指令碼引擎收到指令碼傳過來的
要呼叫的函式:test_func
要傳進去的引數:var1, var2, var3
void *dl_handle = dlopen("***.so", rtld_lazy); // windows下為.dll檔案
void *f = dlsym(dl_handle, "test_func");
__a**__("push %0"::"r"(var1));
__a**__("push %0"::"r"(var2));
__a**__("push %0"::"r"(var3));
// windows下為:
// __a** push var1;
// __a** push var2;
// __a** push var3;
__a**__("call %0"::"r"(f));
__a**__("add %%esp, $0xc");//因為有三個引數,所以是4 * 3 = 12(0xc)
// 然後如果有返回值的話,就從eax裡面獲取返回值。
有了這個東西,指令碼就可以輕鬆的訪問任何動態鏈結庫而不需要對指令碼引擎做修改和重新編譯了。
動態鏈結庫 靜態鏈結庫
包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...
靜態鏈結庫 動態鏈結庫
庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...
靜態鏈結庫,動態鏈結庫
關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...