Linux下c函數dlopen實現載入動態庫so檔案代碼舉例

來源:互聯網
上載者:User

標籤:style   http   io   color   ar   os   使用   sp   strong   

dlopen()是一個強大的庫函數。該函數將開啟一個新庫,並把它裝入記憶體。該函數主要用來載入庫中的符號,這些符號在編譯的時候是不知道的。這種機制使得在系統中添加或者刪除一個模組時,都不需要重新編譯了。可以在自己的程式中使用 dlopen()。dlopen() 在 dlfcn.h 中定義,並在 dl 庫中實現。它需要兩個參數:一個檔案名稱和一個標誌。檔案名稱就是一個動態庫so檔案,標誌指明是否立刻計算庫的依賴性。如果設定為 RTLD_NOW 的話,則立刻計算;如果設定的是 RTLD_LAZY,則在需要的時候才計算。另外,可以指定 RTLD_GLOBAL,它使得那些在以後才載入的庫可以獲得其中的符號。當庫被裝入後,可以把 dlopen() 返回的控制代碼作為給 dlsym() 的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指標,並且調用裝載庫中的相應函數。由 www.169it.com 搜集整理

   在dlopen()函數以指定模式開啟指定的動態串連庫檔案,並返回一個控制代碼給調用進程。使用dlclose()來卸載開啟的庫。

mode是開啟檔案,其值有多個,不同作業系統上實現的功能有所不同,在linux下,按功能可分為三類:

1 解析方式

RTLD_LAZY:在dlopen返回前,對於動態庫中的未定義的符號不執行解析(只對函數引用有效,對於變數引用總是立即解析)。

RTLD_NOW: 需要在dlopen返回前,解析出所有未定義符號,如果解析不出來,在dlopen會返回NULL,錯誤為:: undefined symbol: xxxx.......

2 作用範圍,可與解析方式通過“|”組合使用

RTLD_GLOBAL:動態庫中定義的符號可被其後開啟的其它庫重定位。

RTLD_LOCAL: 與RTLD_GLOBAL作用相反,動態庫中定義的符號不能被其後開啟的其它庫重定位。如果沒有指明是RTLD_GLOBAL還是RTLD_LOCAL,則預設為RTLD_LOCAL。

3 作用方式

RTLD_NODELETE: 在dlclose()期間不卸載庫,並且在以後使用dlopen()重新載入庫時不初始化庫中的靜態變數。這個flag不是POSIX-2001標準。

RTLD_NOLOAD: 不載入庫。可用於測試庫是否已載入(dlopen()返回NULL說明未載入,否則說明已載入),也可用於改變已載入庫的flag,如:先前載入庫的flag為RTLD_LOCAL,用dlopen(RTLD_NOLOAD|RTLD_GLOBAL)後flag將變成RTLD_GLOBAL。這個flag不是POSIX-2001標準。

RTLD_DEEPBIND:在搜尋全域符號前先搜尋庫內的符號,避免同名符號的衝突。這個flag不是POSIX-2001標準。


函數傳回值:

   開啟錯誤返回NULL

   成功,返回庫引用

   編譯時間候要加入 -ldl (指定dl庫)


具體代碼舉例如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include "stdio.h" #include <dlfcn.h> int  main( int  argc, char  *argv[]) {      char  module_name[1024]={ "./test_module.so" };      char  *error=NULL;      void  *module_handle = dlopen(module_name, RTLD_NOW);      if (module_handle == NULL)      {        error = dlerror();        char  tp[1024] = {0};          snprintf(tp, 256,       "Load module \"%s\" error: %s\n" ,       module_name, error);            printf ( "%s" ,tp);        return  1;      } else      {          printf ( "Load module[%s] success!\r\n" ,module_name);      }      return  1; }
  • 文章來源:Linux下c函數dlopen實現載入動態庫so檔案代碼舉例


Linux下c函數dlopen實現載入動態庫so檔案代碼舉例

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.