用dlopen和dlsym得到的函数指针,在dlclose后还能继续使用么? - Linux/Unix社区 / 程序开发区

来源:百度文库 编辑:神马文学网 时间:2024/10/04 06:09:32
共享对象通过dlopen动态加载动态库的
加载完成后,通过dlsym定位到你需要执行的函数指针
然后可以在程序中使用
当不需要使用的时候,再执行dlclose卸载掉动态链接库

自己去一个个函数man一下就明白了,顺手贴给你

C/C++ code
  dlopen -- open a dynamically linked librarySyntax======cc . . . -lc#include void *dlopen(const char *pathname, int mode);


C/C++ code
  dlsym -- get the address of a symbol in a dynamically linked librarySyntax======cc . . . -lc#include void *dlsym(void *handle, const char *name);


Example:

C/C++ code
     void *handle;int i, *iptr;int (*fptr)(int);/* open the needed object */handle = dlopen("/usr/mydir/libx.so", RTLD_LAZY);/* find address of function and data objects */fptr = (int (*)(int))dlsym(handle, "some_function");iptr = (int *)dlsym(handle, "int_object");/* invoke function, passing value of integer as a parameter */i = (*fptr)(*iptr);


C/C++ code
  dlclose -- close a dynamically linked librarySyntax======cc . . . -lc#include int dlclose(void *handle);Description===========dlclose(S) disassociates a shared object (a dynamically linked library inour case) previously opened by dlopen(S) from the current process. Once anobject has been closed using dlclose( ), its symbols are no longeravailable to dlsym(S). All objects loaded automatically as a result ofinvoking dlopen( ) on the referenced object are also closed. handle is theinvoking dlopen( ) on the referenced object are also closed. handle is thevalue returned by a previous invocation of dlopen( ).Return values=============If the referenced object was successfully closed, dlclose( ) returns 0. Ifthe object could not be closed, or if handle does not refer to an openobject, dlclose( ) returns a non-zero value. More detailed diagnosticinformation is available through dlerror(S).Notes=====A successful invocation of dlclose( ) does not guarantee that the objectsassociated with handle have actually been removed from the address space ofthe process. Objects loaded by one invocation of dlopen( ) may also beloaded by another invocation of dlopen( ). The same object may also beopened multiple times. An object is not removed from the address spaceuntil all references to that object through an explicit dlopen( )invocation have been closed and all other objects implicitly referencingthat object have also been closed.associated with handle have actually been removed from the address space ofthe process. Objects loaded by one invocation of dlopen( ) may also beloaded by another invocation of dlopen( ). The same object may also beopened multiple times. An object is not removed from the address spaceuntil all references to that object through an explicit dlopen( )invocation have been closed and all other objects implicitly referencingthat object have also been closed.Once an object has been closed by dlclose( ), referencing symbols containedin that object can cause undefined behavior.See also========dlerror(S), dlopen(S), dlsym(S)Standards conformance=====================dlclose(S) is not part of any currently supported standard; it is anextension of AT&T System V provided by The Santa Cruz Operation, Inc.