linux下dlopen的使用


dlopen()

  功能:打開一個動態鏈接庫

  包含頭文件:

  #include <dlfcn.h>

  函數定義

  void * dlopen( const char * pathname, int mode );

 

  函數描述:

  在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)

  例如

  gcc test.c -o test -ldl

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章