歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下的動態鏈接庫.so文件的使用

Linux下的動態鏈接庫.so文件的使用

日期:2017/2/28 16:00:23   编辑:Linux教程

1 簡介

大家都知道,在WINDOWS系統中有很多的動態鏈接庫(以.DLL為後綴的文件,DLL即Dynamic Link Library)。這種動態鏈接庫,和靜態函數庫不同,它裡面的函數並不是執行程序本身的一部分,而是根據執行程序需要按需裝入,同時其執行代碼可在多個執行程序間共享,節省了空間,提高了效率,具備很高的靈活性,得到越來越多程序員和用戶的青睐。那麼,在LINUX系統中有無這樣的函數庫呢? 答案是肯定的,LINUX的動態鏈接庫不僅有,而且為數不少。在/lib目錄下,就有許多以.so作後綴的文件,這就是LINUX系統應用的動態鏈接庫,只不過與WINDOWS叫法不同,它叫so,即Shared Object,共享對象。

2 如何創建動態鏈接庫

生成動態鏈接庫:

如:

  1. gcc -fpic -shared -o example.so example1.c example2.c
-fpic 使輸出的對象模塊是按照可重定位地址方式生成的。
-shared指定把對應的源文件生成對應的動態鏈接庫文件libstr.so文件。

3 如何使用動態鏈接庫

3.1 dlfcn.h頭文件

Linux下使用動態鏈接庫,源程序需要包含dlfcn.h頭文件,此文件定義了調用動態鏈接庫的函數的原型。下面詳細說明一下這些函數。

3.1.1 dlerror

原型:

  1. const char *dlerror(void);
作用:

當動態鏈接庫操作函數執行失敗時,dlerror可以返回出錯信息,返回值為NULL時表示操作函數執行成功。

3.1.2 dlopen

原型:

  1. void *dlopen (const char *filename, int flag);
作用:

dlopen用於打開指定名字(filename)的動態鏈接庫,並返回操作句柄。

參數說明:

filename: so文件名.如果名字不以/開頭,則非絕對路徑名,將按下列先後順序查找該文件。
(1) 用戶環境變量中的LD_LIBRARY值;
(2) 動態鏈接緩沖文件/etc/ld.so.cache
(3) 目錄/lib,/usr/lib.

flag:表示在什麼時候解決未定義的符號(調用)。取值有兩個:
1) RTLD_LAZY : 表明在動態鏈接庫的函數代碼執行時解決。
2) RTLD_NOW : 表明在dlopen返回前就解決所有未定義的符號,一旦未解決,dlopen將返回錯誤。
dlopen調用失敗時,將返回NULL值,否則返回的是操作句柄。

3.1.3 dlsym

原型:

  1. void *dlsym(void *handle, char *symbol);
作用:

dlsym根據動態鏈接庫操作句柄(handle)與符號(symbol),返回符號對應的函數的執行代碼地址。由此地址,可以帶參數執行相應的函數。

舉例:

  1. void handle =NULL;
  2. void (*add)(int x,int y);
  3. handle =dlopen("xxx.so",RTLD_LAZY);
  4. if (!handler) {
  5. printf( "加載模塊錯誤 %s\n", dlerror() );
  6. return;
  7. }
  8. add=dlsym(handle,"add");
  9. if(add)
  10. add(89,369);
  11. dlclose(handle);

3.1.4 dlclose

原型:

  1. int dlclose (void *handle);
作用:

dlclose用於關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。

Copyright © Linux教程網 All Rights Reserved