Linux程式设计-14.动态函数库 |
| 来源:http://www.openchess.org/noitatsko/programming/ (2001-05-26 12:10:00) |
|
--------------------------------------------------------------------------------
本节说明Linux下动态函数库的使用及设计。
大多数大型的UNIX软体都会将许多个别的部份拆开来设计,通常这些部份被称为「plugins」或「modules」。它们会用许多方式来结合,如「pipe」、「IPC」或「shared objects」。
Linux下的Dynamic Linking Loader介面标准来自於Solaris。
在Dynamic Linking的操作方式下,所有的函数及资料变数都被称为「symbol」,要使用时,需要透过dlsym来找出其实际位址。
--------------------------------------------------------------------------------
所有动态函数载入的函数均宣告在中,共有四个函数。
void *dlopen (const char *filename, int flag);
const char *dlerror(void);
void *dlsym(void *handle, char *symbol);
int dlclose (void *handle);
--------------------------------------------------------------------------------
dlopen()的作用为寻找函数库档案,开启它、并做一些初始化的动作。
filename如果以"/"符号开始,dlopen()将不会搜寻该函数库的路径,否则它将会透过以下方式搜寻档案:
透过LD_LIBRARY_PATH所指定的路径搜寻
/etc/ld.so.cache所指定的路径。该档案是由ldconfig所产生,其设定位於/etc/ld.so.conf。
找寻/usr/lib及/lib两个内定目录。
flag有三个:
RTLD_GLOBAL : 在函数库中的变数内定是不输出的。指定RTLD_GLOBAL可输出这些变数。
RTLD_LAZY : 当函数被执行时,才找出所使用的变数对照表。
RTLD_NOW : 当函数被载入时,立刻找出所使用的变数对照表。
RTLD_GLOBAL可与RTLD_LAZY或RTLD_NOW结合,RTLD_LAZY及RTLD_NOW不可同时使用。
--------------------------------------------------------------------------------
dlerror()返回最近发生的错误讯息,如果没有错误发生,那麽将会返回NULL。
--------------------------------------------------------------------------------
dlsym()载入所指定的函数。
--------------------------------------------------------------------------------
dlclose()关闭开启的函数库。它会检查一个对照计数,将开启的函数库次数数量减一,如果为零,则关闭该函数库。
--------------------------------------------------------------------------------
hellodl
--------------------------------------------------------------------------------
hello.so的设计
--------------------------------------------------------------------------------
(http://www.fanqiang.com)
|
|