dlopen 和 dlsym 动态调用函数

iOS/MacOSX/移动安全  exchen  2年前 (2018-08-20)  2997浏览  0评论

Linux/unix 提供了使用 dlopen 和 dlsym 方法动态加载库和调用函数,这套方法在 macOS 和 iOS 上也支持。

dlopen 打开一个库,获取句柄。
dlsym 在打开的库中查找符号的值。
dlclose 关闭句柄。
dlerror 返回一个描述最后一次调用dlopen、dlsym,或 dlclose 的错误信息的字符串。

动态调用 printf 函数,编写测试代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

#import <dlfcn.h>

typedef int (*printf_func_pointer) (const char * __restrict, ...);

void dynamic_call_function(){

//动态库路径

char *dylib_path = "/usr/lib/libSystem.dylib";

//打开动态库

void *handle = dlopen(dylib_path, RTLD_GLOBAL | RTLD_NOW);

if (handle == NULL) {

//打开动态库出错

fprintf(stderr, "%s\n", dlerror());

} else {

//获取 printf 地址

printf_func_pointer printf_func = dlsym(handle, "printf");

//地址获取成功则调用

if (printf_func) {

int num = 100;

printf_func("Hello exchen.net %d\n", num);

printf_func("printf function address 0x%lx\n", printf_func);

}

dlclose(handle); //关闭句柄

}

}

int main(int argc, char * argv[]) {

@autoreleasepool {

dynamic_call_function();

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

}

}

在手机上运行的输出结果如下:

1

2

Hello exchen.net 100

printf function address 0x189f0da78

转载请注明:exchen's blog » [iOS Hacker] dlopen 和 dlsym 动态调用函数

补充dlsym():

获取新符号

进程可以使用 dlsym(3C) 获取特定符号的地址。此函数采用句柄符号名称,并将符号地址返回给调用方。该句柄通过以下方式指示符号搜索:

在以下可能很常见的示例中,应用程序首先会将其他目标文件添加到其地址空间。然后,应用程序会使用 dlsym(3C) 来查找函数或数据符号。接下来,应用程序将使用这些符号来调用这些新目标文件中提供的服务。文件 main.c 包含以下代码:

#include    <stdio.h>#include    <dlfcn.h>main(){void *  handle;int *   dptr, (* fptr)();if ((handle = dlopen("foo.so.1", RTLD_LAZY)) == NULL) {(void) printf("dlopen: %s\n", dlerror());exit (1);}if (((fptr = (int (*)())dlsym(handle, "foo")) == NULL) ||((dptr = (int *)dlsym(handle, "bar")) == NULL)) {(void) printf("dlsym: %s\n", dlerror());exit (1);}return ((*fptr)(*dptr));}

首先会在文件 foo.so.1 中搜索符号 foo 和 bar,然后在与此文件关联的所有依赖项中搜索。接下来,在 return() 语句中使用单个参数 bar 调用函数 foo。

使用前面的文件 main.c 生成的应用程序 prog 包含下列依赖项。

dlopen 和 dlsym 动态调用函数相关推荐

  1. linux dlopen函数,dlopen 和 dlsym 动态调用函数

    Linux/unix 提供了使用 dlopen 和 dlsym 方法动态加载库和调用函数,这套方法在 macOS 和 iOS 上也支持. dlopen 打开一个库,获取句柄. dlsym 在打开的库中 ...

  2. dlopen 和 dlsym 动态链接库调用函数

    Linux提供了一套API来动态装载库.下面列出了这些API:函数 - dlopen,打开一个库,并为使用该库作些准备.spa- dlsym,在打开的库中查找符号的值.命令行- dlclose,关闭库 ...

  3. python调用函数示例_python 动态调用函数实例解析

    1. 根据字符串名称 动态调用 python文件内的方法eval("function_name")(参数) 2. 根据字符串 动态调用类中的静态方法,getattr(ClassNa ...

  4. java 动态调用函数_深入讲解Java语言中的函数动态调用方式

    相 信 有 不 少 人 使 用C 语 言 的 函 数 指 针 实 现 过 函 数 的 动 态 调 用. 适 当 地 运 用 函 数 动 态 调 用 功 能 不 仅 能 减 少 代 码 数 量, 而 且 ...

  5. 【python】动态调用函数名

    环境: C:\Users\DELL\Desktop>python -V Python 3.9.10 源码: #!/bin/env python # encoding = utf-8 import ...

  6. dlsym 动态调用动态链接库

    dlsym 样例 hello.c hello_test.c 执行.a 样例 hello.c #include <stdio.h> int xx = 996;void test() {pri ...

  7. php 动态修改函数,php – 动态调用函数

    是的你可以: $varFunction(); 要么: call_user_func($varFunction); 确保您为恶意输入验证$varFunction. 编辑: 对于您的模块,请考虑这样的(取 ...

  8. C语言dlopen()和dlsym()获取函数的运行时地址

    在C语言中,可以使用库函数dlopen()和dlsym()来获取函数的运行时地址.dlopen()函数用于打开共享库,dlsym()函数用于查找共享库中的符号(函数名),并返回其地址. 下面是一个示例 ...

  9. 【转】采用dlopen、dlsym、dlclose加载动态链接库

    1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主控制逻辑不变,将各个业务以动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...

最新文章

  1. Spring AOP编程-传统基于aspectJ切点AOP开发
  2. 2016年-2020年 考研 国家线汇总
  3. 如何定义一个有效的OWIN Startup Class
  4. 一个古怪的VISTA网络问题解决的坎坷经历
  5. Linux下的 FTP
  6. python要背的单词_Python-默背单词
  7. AD转换中参考电压的作用 .
  8. 蚂蚁技术专家:一篇文章带你学习分布式事务
  9. 开源正在吞噬软件业?看开源的7大理念
  10. 转: c#.net利用RNGCryptoServiceProvider产生任意范围强随机数的办法
  11. docker强制删除none的image镜像
  12. android 删除wifi文件,如何删除无线配置文件
  13. echarts无数据时显示暂无数据进行占位
  14. Python 身份证校验代码
  15. 福利:appium+selenium+python 模拟手工点击趣头条(app赚钱软件)
  16. 局域网或者本地开发https自签名证书解决办法
  17. Bus error的调试解决方法
  18. 计算机图形学——反走样技术
  19. 6000级石阶见证绝世爱情
  20. STM32唯一序列号UID--HAL_GetUIDw0详解

热门文章

  1. 贺岁杯围棋争霸赛打响 系列赛事启幕潘晓婷等将亮相
  2. Python3.7 如何安装dlib
  3. Caffe的python接口安装
  4. 学习二叉树之SpringCloud+Spring Boot+Mybatis+ElementUI 大型企业分布式微服务云架构源码
  5. 【毕业设计】深度学习人脸性别年龄识别系统 - python opencv
  6. 用Java码出的动态烟花特效
  7. Java实现 JSON 的组装和解析
  8. 格林威治标准时间/世界时
  9. python实现操作excel,数据写入excel的一行或者一列
  10. 华为:让智能融入血脉