Linux動態庫函數的詳解
加載動態庫
void *dlopen(const char *filename, int flag);
flag的可能值:
- RTLD_LAZY
- RTLD_NOW
- RTLD_GLOBAL
- RTLD_LOCAL
- RTLD_NODELETE (since glibc 2.2)
- RTLD_NOLOAD (since glibc 2.2)
- RTLD_DEEPBIND
這些flag的具體含義可使用man查看
返回動態庫中最近的一次錯誤
根據動態庫句柄和函數名稱,返回函數的地址
void *dlsym(void *handle, const char *symbol);
如果使用dlopen(NULL, flag>)得到句柄,通過這個句柄可以查找所有函數符號,只要那個函數符號所在的dll在加載時指定了RTLD_GLOBAL
關閉動態庫
int dlclose(void *handle);
根據函數地址,返回函數名稱和其它信息
注意傳入地址只要落在函數代碼空間范圍之內即可,不需要是函數的起始地址
int dladdr(void *addr, Dl_info *info);
typedef struct {
const char *dli_fname;/* Filename of defining object */
void *dli_fbase; /* Load address of that object */
const char *dli_sname;/* Name of nearest lower symbol */
void *dli_saddr; /* Exact value of nearest symbol */
} Dl_info;
構造函數和析構函數(這兩個是屬性,而不是函數)
__attribute__((constructor))
__attribute__((destructor))
例如:
__attribute__((constructor)) void before_main()
{
printf("before main/n");
}
__attribute__((destructor)) void after_main()
{
printf("after main/n");
}
如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
您可能感興趣的文章:- linux下編譯boost.python簡單方法
- 深入探討Linux靜態庫與動態庫的詳解(一看就懂)
- linux生成(加載)動態庫靜態庫和加載示例方法
- Linux下g++編譯與使用靜態庫和動態庫的方法
- 分析Windows和Linux動態庫
- linux 程序、動態庫、靜態庫內部添加版本號和編譯時間詳解
- 解決Linux程序編譯鏈接動態庫版本的相關問題
- Linux靜態庫與動態庫實例詳解
- 淺談Linux C語言動態庫及靜態庫
- linux中使用boost.python調用c++動態庫的方法