dlopen 与dlsym

2024-08-20 20:58
文章标签 dlopen dlsym

本文主要是介绍dlopen 与dlsym,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

共享对象通过dlopen动态打开动态库的加载完成后,返回一个句柄,通过dlsym定位到你需要执行的函数指针然后可以在程序中使用


dlopen -- open a dynamically linked library

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

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

 

参考资料http://topic.csdn.net/u/20090422/17/2ddcab88-2d50-478a-9b2e-2c2978ad604b.html

http://hi.baidu.com/janefei1603/blog/item/72ae708eed638eda503d923b.html

Additional link: http://tldp.org/HOWTO/Program-Library-HOWTO/dl-libraries.html

dlopen

基本定义

功能:打开一个动态链接库 
  包含头文件: 
#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
  例如 
gcc test.c -o test -ldl
编辑本段
使用 dlopen
dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。比如 Apache Web 服务器利用这个函数在运行过程中加载模块,这为它提供了额外的能力。一个配置文件控制了加载模块的过程。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。 
  可以在自己的程序中使用 dlopen()dlopen() dlfcn.h 中定义,并在 dl 库中实现。它需要两个参数:一个文件名和一个标志。文件名可以是我们学习过的库中的 soname。标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话,则立刻计算;如果设置的是 RTLD_LAZY,则在需要的时候才计算。另外,可以指定 RTLD_GLOBAL,它使得那些在以后才加载的库可以获得其中的符号。

  当库被装入后,可以把 dlopen() 返回的句柄作为给 dlsym() 的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。


dlsym

 
dlsym()的函数原型是 
void*dlsym(void* handle,const char* symbol) 
  该函数在<dlfcn.h>文件中。 
handle是由dlopen打开动态链接库后返回的指针,symbol就是要求获取的函数的名称,函数返回值是void*,指向函数的地址,供调用使用

取动态对象地址:
#include <dlfcn.h>
void *dlsym(void *pHandle, char *symbol);
dlsym根据动态链接库操作句柄(pHandle)与符号(symbol),返回符号对应的地址。
使用这个函数不但可以获取函数地址,也可以获取变量地址。比如,假设在so
定义了一个voidmytest()函数,那在使用so时先声明一个函数指针:
void (*pMytest)(),然后使用dlsym函数将函数指针pMytest指向mytest函数,
pMytest = (void (*)())dlsym(pHandle, "mytest");

这篇关于dlopen 与dlsym的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1091151

相关文章

linux dlopen手册翻译

名称 dlclose, dlopen, dlmopen 打开和关闭一个共享对象 简介 #include <dlfcn.h>void *dlopen(const char*filename, int flags);int dlclose(void *handle);#define _GNU_SOURCE#include <dlfcn.h>void *dlmoopen(Lmid_t lm

dlopen API

介绍  如何使用dlopen API动态地加载C++函数和类,是Unix C++程序员经常碰到的问题。事实上,情况偶尔有些复杂,需要一些解释。这正是写这篇mini HOWTO的缘由。  理解这篇文档的前提是对C/C++语言中dlopen API有基本的了解。这篇HOWTO的维护链接是 http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/   版权

UnsatisfiedLinkError: dlopen /data/data/package/app_jni_lib/libxxx.so is 32-bit instead of 64-bit

昨天掉到一个大坑里,本来说要增加arm64的支持,心想这还不简单,在libs目录下新建一个arm64-v8a的目录,然后对应的libxxx.so放进去就万事大吉了。提完patch,在三星Galaxy S6上试了一下没问题,就上线了~~  结果刚上GP半小时,出现好几十个崩溃,评分刷刷刷往下掉,吓死宝宝了。。。报的错都是说库是32位的: java.lang.UnsatisfiedLinkErr

dlopen dlsym dlclose解析

1.  打开动态链接库:     #include <dlfcn.h>     void *dlopen(const char *filename, int flag);     该函数返回操作句柄,如:     void *pHandle = dlopen(strSoFilePath, RTLD_LAZY); 2.  取动态对象地址:     #inclu

navicat链接centos7数据库失败Authentication plugin ‘caching_sha2_password‘ cannot be loaded: dlopen(../Frame

重新配置云上数据库 mysql -u root -p use mysql; select user, host, plugin, authentication_string from user\G; ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘你的密码’; 登陆云更改端口 fire

C语言中dlsym的小例子

dlopen dlsym dlclose dlerror主要是实现在其他代码中通过符号调用动态库中的函数或者变量,具体如下 编写一个动态库的.c文件,libshare.c 编译 gcc -g -fPIC -shared libshare.c -o libshare.so 编写调用函数的文件mymain.c  编译mymain.c gcc mymain.c -ldl生成a.ou

解决动态加载java.lang.UnsatisfiedLinkError: dlopen failed * is 32-bit instead of 64-bit 报错

用动态加载的方式拉起插件apk,由于插件apk中有so文件,于是出现错误 E/AndroidRuntime: FATAL EXCEPTION: Thread-7Process: androidx.xxxxxxdemo, PID: 8303java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/xxxxxxxx/app.apk-dir/

dlopen 打开失败

dlopen打开库失败 查看日志提示dlopen failed 查看日志提示dlopen failed 1、确认路径是否正确 2、确认目标文件是否是动态库(用ldd 文件名, 若不能查到文件信息,说明不是动态库文件) 3、找不到标识符号,可以将错误信息打印出来,使用nm -u test.so可以找出来没有定义的符号。 解决措施: 1、修改到正确的路径 2、文件类型要正确 3、增

dlopen、dlsym和dlclose的使用和举例

dlopen、dlsym和dlclose的使用和举例     之前用过这三个函数一直没时间整理一下。今天抽时间整理一下。 1、函数简介 dlopen 基本定义 功能:打开一个动态链接库    包含头文件:    #include <dlfcn.h>    函数定义:    void * dlopen( const char * pathname, int mode );    函数

动态链接函数(dlopen/dlsym/dlclose)使用总结

一、简介 动态链接函数操作(显式运行时链接)主要包含头文件dlfcn.h(/usr/include/dlfcn.h),涉及的常用的函数主要有dlopen,dlysm,dlclose。主要作用是从动态库中加载函数到程序中使用,好处是编译的时候不需要链接动态库。 二、函数原型 2.1 dlopen 该函数用于打开动态库并返回句柄。 void *dlopen (const char *__fi