天天看點

采用dlopen、dlsym、dlclose加載動态連結庫【轉】

1、前言

  為了使程式友善擴充,具備通用性,可以采用插件形式。采用異步事件驅動模型,保證主程式邏輯不變,将各個業務已動态連結庫的形式加載進來,這就是所謂的插件。linux提供了加載和處理動态連結庫的系統調用,非常友善。本文先從使用上進行總結,涉及到基本的操作方法,關于動态連結庫的本質及如何加載進來,需要進一步學習,後續繼續補充。如何将程式設計為插件形式,挖掘出主題和業務之間的關系,需要進一步去學習。

2、生産動态連結庫

編譯參數 gcc -fPIC -shared 

例如将如下程式編譯為動态連結庫libcaculate.so,程式如下:

采用dlopen、dlsym、dlclose加載動态連結庫【轉】
采用dlopen、dlsym、dlclose加載動态連結庫【轉】
采用dlopen、dlsym、dlclose加載動态連結庫【轉】
采用dlopen、dlsym、dlclose加載動态連結庫【轉】

編譯如下: gcc -fPIC -shared caculate.c -o libcaculate.so 

采用dlopen、dlsym、dlclose加載動态連結庫【轉】

3、dlopen、dlsym函數介紹

      在linux上man dlopen可以看到使用說明,函數聲明如下:

采用dlopen、dlsym、dlclose加載動态連結庫【轉】
采用dlopen、dlsym、dlclose加載動态連結庫【轉】
采用dlopen、dlsym、dlclose加載動态連結庫【轉】
采用dlopen、dlsym、dlclose加載動态連結庫【轉】

  dlopen以指定模式打開指定的動态連接配接庫檔案,并傳回一個句柄給調用程序,dlerror傳回出現的錯誤,dlsym通過句柄和連接配接符名稱擷取函數名或者變量名,dlclose來解除安裝打開的庫。 dlopen打開模式如下:

  RTLD_LAZY 暫緩決定,等有需要時再解出符号 

RTLD_NOW 立即決定,傳回前解除所有未決定的符号。

采用上面生成的libcaculate.so,寫個測試程式如下:

采用dlopen、dlsym、dlclose加載動态連結庫【轉】
采用dlopen、dlsym、dlclose加載動态連結庫【轉】
采用dlopen、dlsym、dlclose加載動态連結庫【轉】
采用dlopen、dlsym、dlclose加載動态連結庫【轉】

編譯選項如下:gcc -rdynamic -o main main.c -ldl

測試結果如下所示:

采用dlopen、dlsym、dlclose加載動态連結庫【轉】

參考資料:

<a href="http://blog.chinaunix.net/uid-26285146-id-3262288.html">http://blog.chinaunix.net/uid-26285146-id-3262288.html</a>

<a href="http://www.360doc.com/content/10/1213/22/4947005_77867631.shtml">http://www.360doc.com/content/10/1213/22/4947005_77867631.shtml</a>

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/7505861.html,如需轉載請自行聯系原作者

繼續閱讀