当前位置:  技术问答>linux和unix

用dlopen和dlsym得到的函数指针,在dlclose后还能继续使用么?

    来源: 互联网  发布时间:2016-05-31

    本文导语:  请高手具体谈谈共享对象的加载和卸载机制。 | 不能dlclose的,除非你是确定不再使用了的才需要dlclose,否则不要执行这个操作 共享对象通过dlopen动态加载动态库的 加载完成后,通过dlsym定...

请高手具体谈谈共享对象的加载和卸载机制。

|
不能dlclose的,除非你是确定不再使用了的才需要dlclose,否则不要执行这个操作

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

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

  dlopen -- open a dynamically linked library

  Syntax
  ======

  cc . . . -lc

  #include 

  void *dlopen(const char *pathname, int mode);


  dlsym -- get the address of a symbol in a dynamically linked library

  Syntax
  ======

  cc . . . -lc

  #include 

  void *dlsym(void *handle, const char *name);


Example:

     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);


  dlclose -- close a dynamically linked library

  Syntax
  ======

  cc . . . -lc

  #include 

  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.

|
一般情况下,貌似 dlcose后,很少有人再使用其前面解析出来的函数吧...

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux 动态库 dlopen
  • libdl.so这个库有什么用啊?dlopen等只能用于C接口吗?
  • dlopen的超难问题。也是g++和gcc的问题。
  • dlopen的难题
  • 请问在SCO Unix下, dlopen在哪个.a文件中
  • 编动态链接库时,提示 对‘dlopen’未定义的引用.
  • dlopen出错。
  • 动态库dlopen时候:ELF file OS ABI invalid
  • Linux 动态库 dlopen()失败,errno = 17, File exists
  • dlopen 相关编译链接解惑
  • c程序调dlopen C++的动态库的问题,急!
  • 求解:Aix5.2系统中dlopen错误,dlerror返回“Bad Address”
  • dlopen 里面异常问题怎么解决?求助大家(RedHat AS 2.1 )
  • 在linux下(c++),如何动态调用 动态库(.so)? 为什么我编译报错:undefined reference to "dlopen"
  • dlopen加载so动态链接库出现段错误的问题
  • dlopen(): ./libhello.so: undefined symbol: _ZN10QTransformC1Ev ,这是什么错误?
  • 请教:dlopen总是打不开动态库文件??
  • solaris, dlopen 加载动态库崩溃,请帮助分析谢谢


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3