看板 million
作者 標題 [note] HAL 層與dlsym, dlopen 資訊
時間 2015年02月05日 Thu. PM 02:10:24
寫一個 .so 檔, 與如何在程式中動態呼叫此 .so 檔中的函式 的範例
http://bjglife.blogspot.tw/2014/12/linux-dlopen-dlsym.html
呼叫 libmath.so 的範例
http://welkinchen.pixnet.net/blog/post/40964449-gcc動態連結
建立 shared library 的方法, 感覺這個比較正確
http://itzone.hk/article/article.php?aid=200406271608445175
使用時一些注意事項
http://blog.listnukira.com/dynamically-lodaded-libraries/
統整資訊! (注意!!!未經驗證)
(1) 寫一個 .so 檔函式庫:
寫好函式定義和宣告, 比如說 回傳型態是 int 的指標, 輸入有 const char*, double
編譯: gcc -fPIC -c libxxx.c 再 gcc -shared libxxx.o -o libxxx.so
(2) 客戶端要怎麼用?
<A> 先 include 包含 dlsym, dlopen 等等函式標頭的 header檔: #include <dlfcn.h>
<B> 宣告一個指標, 用 dlopen 函式打開剛才編譯好的 .so 檔, 並指定參數. 指標則接收 dlopen 回傳.
void *handle; handle=dlopen(".so檔路徑", 參數); // 參數可為 RTLD_LAZY 或 RTLD_NOW 等等...
如果指標接收到 NULL, 表示無法讀取 .so 檔.
<C> 宣告一個函式指標, 用 dlsym 函式來打開上記指標, 以便連結到 .so 檔中的函式.
指標類型要與函式的回傳值類型一樣, 後面傳入參數的順序和型態也要一致
例:
int *( *func_ptr) (const char*, double);
<D> 再用此函式指標去接收 dlsym() 傳回之值, 若傳回 NULL, 則"不一定但很有可能"表示找不到該函式
例:
func_ptr = ( int*(*)(const char*, double) )dlsym(handle, "函式的名稱" );
/* 註: 那個亮黃色是指, 回傳值的型態. 所以如果沒有要回傳指標, 省略亮黃色星號 */
呼叫例:
intVariable = func_ptr("constant string", doubleValue);
編譯: gcc clientCode.c -ldl -o a.out
因為客戶端用到了 dlfcn.h 裡的函式, 所以要加參數LDL去編譯
若用 c 語言, LDL 的擺放順序有差, 不知為何: gcc -ldl clientCode.c 這樣寫會沒用
上記參考來源: http://stackoverflow.com/questions/956640/linux-c-error-undefined-reference-to-dlopen
--
※ 作者: emulators 時間: 2015-02-05 14:10:24
※ 編輯: emulators 時間: 2015-02-17 10:19:35
※ 看板: million 文章推薦值: 0 目前人氣: 0 累積人氣: 300
回列表(←)
分享