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

您要找的是不是:
vi. 梦想;做梦,梦见;想到 | n. 梦想,...
You call dlsym(RTLD_NEXT, "open").
可以调用dlsym(RTLD_NEXT, "open")。
Using dlsym to extract a hidden symbol returns NULL.
使用dlsym提取一个隐藏的符号将会返回NULL。
The entry point printLowercase address is returned by dlsym.
dlsym返回入口点printLowercase 的地址。
Note that after each call to dlopen, dlsym, or dlclose, a call is made to dlerror to get the last error and the error string is printed. Here is a test run of dlTest
注意,每次调用dlopen 、dlsym或dlclose 之后,调用dlerror以获取最后的错误信息,并且打印该错误信息字符串。
dlsym return a pointer to the requested entry point
dlsym返回一个指向被请求入口点的指针
The entry point printUPPERCASE address is returned by dlsym.
dlsym 返回入口点printUPPERCASE 的地址。
The application gains access to the shared objects by using function calls dlopen, dlsym, and dlclose to the dynamic linking loader.
应用程序通过使用对动态链接装入器的dlopen、dlsym和dlclose函数调用来获取对共享目标文件的访问。
The UNIX equivalents for the same functions are the dlopen, dlsym, and dlclose routines.
对于这些函数,UNIX 的等价物分别是dlopen、dlsym和dlclose例程。
In pseudo, the address returned for dlsym(RTLD_NEXT, "open") is stored in a function pointer named real_open().
在pseudo 中,为dlsym(RTLD_NEXT, "open")返回的地址储存在名为 real_open() 的函数指针中。
In pseudo, the address returned for dlsym(RTLD_NEXT, "open") is stored in a function pointer named real_open().
在pseudo 中,为dlsym(RTLD_NEXT, "open")返回的地址储存在名为 real_open() 的函数指针中。
$firstVoiceSent
- 来自原声例句
请问您想要如何调整此模块?
感谢您的反馈,我们会尽快进行适当修改!
请问您想要如何调整此模块?
感谢您的反馈,我们会尽快进行适当修改!当前位置: &
求翻译:android_log_print dlclose dlopen dlsym _Znwj memcpy fopen setjmp fclose __stack_chk_fail是什么意思?
android_log_print dlclose dlopen dlsym _Znwj memcpy fopen setjmp fclose __stack_chk_fail
问题补充:
正在翻译,请等待...
android_log_print dlclose dlopen memcpy dlsym的_Znwj fopen setjmp fclose __stack_chk_fail
android_log_print dlclose dlopen dlsym _Znwj memcpy fopen setjmp fclose __stack_chk_fail
android_log_print dlclose dlopen dlsym _Znwj memcpy fopen setjmp fclose __stack_chk_fail
正在翻译,请等待...
我来回答:
参考资料:
* 验证码:
登录后回答可以获得积分奖励,并可以查看和管理所有的回答。 |
我要翻译和提问
请输入您需要翻译的文本!您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
linux 调用态库so文件.doc 36页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:150 &&
linux 调用态库so文件
你可能关注的文档:
··········
··········
linux调用动态库so文件分类:?c++那些事4:55?4831人阅读?评论(0)?收藏?举报linuxdlliostreamclass编译器winapi??关于动态调用动态库方法说明? 一、???????动态库概述? 1、?动态库的概念? 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输出操作或屏幕控制等标准任务函数)。可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库。库文件中的函数可以通过连接程序与应用程序进行链接,这样就不必在每次开发程序时都对这些通用的函数进行编译了。??????动态库是一种在已经编译完毕的程序开始启动运行时,才被加载来调用其中函数的库。其加载方式与静态库截然不同。2、?动态库的命名? Linux下,动态库通常以.so(shareobject)结尾。(通常/lib和/usr/lib等目录下存在大量系统提供的以.so结尾的动态库文件)Windows下,动态库常以.dll结尾。(通常C:\windows\System32等目录下存在大量系统提供的以.dll结尾的动态库文件)3、?动态库与静态库之间的区别? 静态库是指编译连接时,把库文件的代码全部加入到可执行文件中,所以生成的文件较大,但运行时,就不再需要库文件了。即,程序与静态库编译链接后,即使删除静态库文件,程序也可正常执行。动态库正好相反,在编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。即,程序只在执行启动时才加载动态库,如果删除动态库文件,程序将会因为无法读取动态库而产生异常。二、???????Linux下动态调用动态库? 备注:以下linux实例说明都是在RedHat5.1系统+gcc版本4.1.(RedHat4.1.2-46)上实现。1、?.so动态库的生成? 可使用gcc或者g++编译器生成动态库文件(此处以g++编译器为例)g++-shared-fPIC-cXXX.cppg++-shared-fPIC-oXXX.soXXX.o2、?.so动态库的动态调用接口函数说明? 动态库的调用关系可以在需要调用动态库的程序编译时,通过g++的-L和-l命令来指定。例如:程序test启动时需要加载目录/root/src/lib中的libtest_so1.so动态库,编译命令可照如下编写执行:g++-g-otesttest.cpp–L/root/src/lib–ltest_so1(此处,我们重点讲解动态库的动态调用的方法,关于静态的通过g++编译命令调用的方式不作详细讲解,具体相关内容可上网查询)?Linux下,提供专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。下面对这些接口函数逐一介绍(调用这些接口时,需引用头文件#include&dlfcn.h&):1)???????dlopen函数原型:void*dlopen(constchar*libname,intflag);功能描述:dlopen必须在dlerror,dlsym和dlclose之前调用,表示要将库装载到内存,准备使用。如果要装载的库依赖于其它库,必须首先装载依赖库。如果dlopen操作失败,返回NULL值;如果库已经被装载过,则dlopen会返回同样的句柄。参数中的libname一般是库的全路径,这样dlopen会直接装载该文件;如果只是指定了库名称,在dlopen会按照下面的机制去搜寻:a.根据环境变量LD_LIBRARY_PATH查找b.根据/etc/ld.so.cache查找c.查找依次在/lib和/usr/lib目录查找。flag参数表示处理未定义函数的方式,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暂时不去处理未定义函数,先把库装载到内存,等用到没定义的函数再说;RTLD_NOW表示马上检查是否存在未定义的函数,若存在,则dlopen以失败告终。2)???????dlerror函数原型:char*dlerror(void);功能描述:dlerror可以获得最近一次dlopen,dlsym或dlclose操作的错误信息,返回NULL表示无错误。dlerror在返回错误信息的同时,也会清除错误信息。3)???????dlsym函数原型:void*dlsym(void*handle,constchar*symbol);功能描述:在dlopen之后,库被装载到内存。dlsym可以获得指定函数(symbol)在内存中的位置(指针)。如果找不到指定函数,则dlsym会返回NULL值。但判断函数是否存在最好的方法是使用dlerror函数,4)???????dlclos
正在加载中,请稍后...12550人阅读
Linux(154)
& 之前用过这三个函数一直没时间整理一下。今天抽时间整理一下。
1、函数简介
功能:打开一个动态链接库&
  包含头文件:&
  #include &dlfcn.h&&
  函数定义:&
  void * dlopen( const char * pathname, int mode );&
  函数描述:&
  在dlopen的()函数以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程。使用dlclose()来卸载打开的库。&
  mode:分为这两种&
  RTLD_LAZY
暂缓决定,等有需要时再解出符号&
  RTLD_NOW
立即决定,返回前解除所有未决定的符号。&
  RTLD_LOCAL&
  RTLD_GLOBAL
允许导出符号&
  RTLD_GROUP&
  RTLD_WORLD&
  返回值:&
  打开错误返回NULL&
  成功,返回库引用&
  编译时候要加入 -ldl (指定dl库)&
根据动态链接库操作句柄与符号,返回符号对应的地址。
#include &dlfcn.h&
void*dlsym(void* handle,const char* symbol)
dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。
handle是由打开后返回的,symbol就是要求获取的函数或的名称。
dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
上述都是摘抄,总结为链接的时候需要用到dl库,编译的时候需要加上dlfcn.h头文件。才能保证编译不会报错。
2、生成动态库
hello.c函数原型:
#include &sys/types.h&
#include &signal.h&
#include &stdio.h&
#include &unistd.h&
typedef struct {
&const char&*
&int& (*GetValue)(char *pszVal);
&int&& (*PrintfHello)();
} hello_ST_API;
int GetValue(char *pszVal)
&int retval = -1;
&if (pszVal)
&&retval = sprintf(pszVal, &%s&, &123456&);
&&printf(&%s, %d, pszVer = %s\n&, __FUNCTION__, __LINE__, pszVal);
int PrintfHello()
&int retval = -1;
&printf(&%s, %d, hello everyone\n&, __FUNCTION__, __LINE__);
&return 0;
const hello_ST_API& Hello = {
&&& &.module&= &hello&,
&& GetValue,
&& PrintfHello,
编译的时候用指令:
gcc -shared -o hello.so hello.c
上面的函数是用一个全局结构体hello来指向。在dlsym定义中说不仅可以获取函数的地址,还可以获取全局变量的地址。所以此处是想通过dlsym来获取全局变量的地址。好处自己慢慢体会。
3、dlopen代码
#include &sys/types.h&
#include &signal.h&
#include &stdio.h&
#include &unistd.h&
#include &dlfcn.h&
typedef struct {
&const char&*
&int& (*GetValue)(char *pszVal);
&int&& (*PrintfHello)();
} hello_ST_API;
int main(int argc, char **argv)
&hello_ST_API *
&int i = 0;
&char psValue[20] = {0};
&handle = dlopen(“库存放的绝对路径,你可以试试相对路径是不行的&, RTLD_LAZY);
&if (! handle) {
&&printf(&%s,%d, NULL == handle\n&, __FUNCTION__, __LINE__);
&&return -1;
&dlerror();
&hello = dlsym(handle, &Hello&);
&if (!hello) {
&&printf(&%s,%d, NULL == handle\n&, __FUNCTION__, __LINE__);
&&return -1;
&if (hello && hello-&PrintfHello)
&&i = hello-&PrintfHello();
&&printf(&%s, %d, i = %d\n&, __FUNCTION__, __LINE__, i);
&if (hello && hello-&GetValue)
&&i = hello-&GetValue(psValue);
&if (hello && hello-&module)
&&&printf(&%s, %d, module = %s\n&, __FUNCTION__, __LINE__, hello-&module);
&&& dlclose(handle);
&&& return 0;
编译指令:gcc -o&test hello_dlopen.c -ldl
运行./test结果如下。
PrintfHello, 27, hello everyone
main, 36, i = 0
GetValue, 19, pszVer = 123456
main, 42, module = hello
可以看到结果正常出来了。
看到没用?dlsym找到全局结构体hello后,可以直接用这个全局结构体指针来使用库里面的函数了,因为我们有时候提供的库不仅仅是一个两个函数的,一般的一个库都会存在多个函数,用这种方式就可以直接使用了。不然找函数名称的话要写多少个dlsym啊?
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:918177次
积分:8554
积分:8554
排名:第1981名
原创:16篇
转载:356篇
评论:69条
(1)(1)(3)(1)(2)(3)(1)(3)(7)(7)(1)(9)(8)(1)(3)(3)(8)(3)(2)(3)(2)(4)(2)(2)(10)(6)(4)(3)(5)(7)(6)(11)(13)(8)(2)(5)(4)(24)(6)(15)(13)(3)(39)(23)(4)(7)(12)(21)(39)(1)(2)在native使用中使用dlXXX函数(dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym)_操作系统大全_优良自学吧 |
当前位置: >
> 在native使用中使用dlXXX函数(dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym)优良自学吧提供在native使用中使用dlXXX函数(dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym),在native应用中使用dlXXX函数(dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym) 1. 包含需要的头文件
#include &dlfcn.h& 2. 如果是 NDK 环境,在 Android.m在native应用中使用dlXXX函数(dladdr, dlclose, dlerror, dlopen, dlsym, dlvsym)
1. 包含需要的头文件
#include &dlfcn.h&
2. 如果是 NDK 环境,在 Android.mk 加入
LOCAL_LDLIBS := -ldl
如果是 Source 环境,在 Android.mk 加入
LOCAL_SHARED_LIBRARIES := libdl(本文来自互联网,不代表搜站(/)的观点和立场)本站所有内容来自互联网,若本站收录的信息无意侵犯了贵司版权,请给我们来信(),我们会及时处理和回复,谢谢编辑推荐最近更新}

我要回帖

更多关于 linux dlclose 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信