分享

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

 enrol 2010-12-13
共享对象通过dlopen动态加载动态库的
加载完成后,通过dlsym定位到你需要执行的函数指针
然后可以在程序中使用
当不需要使用的时候,再执行dlclose卸载掉动态链接库

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

C/C++ code
dlopen -- open a dynamically linked library Syntax ====== cc . . . -lc #include <dlfcn.h> void *dlopen(const char *pathname, int mode);


C/C++ code
dlsym -- get the address of a symbol in a dynamically linked library Syntax ====== cc . . . -lc #include <dlfcn.h> 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 library Syntax ====== cc . . . -lc #include <dlfcn.h> int dlclose(void *handle); Description =========== dlclose(S) disassociates a shared object (a dynamically linked library in our case) previously opened by dlopen(S) from the current process. Once an object has been closed using dlclose( ), its symbols are no longer available to dlsym(S). All objects loaded automatically as a result of invoking dlopen( ) on the referenced object are also closed. handle is the invoking dlopen( ) on the referenced object are also closed. handle is the value returned by a previous invocation of dlopen( ). Return values ============= If the referenced object was successfully closed, dlclose( ) returns 0. If the object could not be closed, or if handle does not refer to an open object, dlclose( ) returns a non-zero value. More detailed diagnostic information is available through dlerror(S). Notes ===== A successful invocation of dlclose( ) does not guarantee that the objects associated with handle have actually been removed from the address space of the process. Objects loaded by one invocation of dlopen( ) may also be loaded by another invocation of dlopen( ). The same object may also be opened multiple times. An object is not removed from the address space until all references to that object through an explicit dlopen( ) invocation have been closed and all other objects implicitly referencing that object have also been closed. associated with handle have actually been removed from the address space of the process. Objects loaded by one invocation of dlopen( ) may also be loaded by another invocation of dlopen( ). The same object may also be opened multiple times. An object is not removed from the address space until all references to that object through an explicit dlopen( ) invocation have been closed and all other objects implicitly referencing that object have also been closed. Once an object has been closed by dlclose( ), referencing symbols contained in 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 an extension of AT&T System V provided by The Santa Cruz Operation, Inc.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多