iOS 中使用 dlsym 按名称调用函数

2023-12-22

在 iOS 中不能通过名称调用函数吗?我有一个名为的 C 函数getstring。我这样称呼它:

void* handle = dlopen(NULL, RTLD_NOW);
if (handle)
{
fp func = dlsym(handle, "getstring");
if (!func)
    responseField.text = [NSString stringWithUTF8String:dlerror()];
else {
    char* tmpStr = func();
    responseField.text = [NSString stringWithUTF8String:tmpStr];        
}
}
else {
responseField.text = [NSString stringWithUTF8String:dlerror()];
}

当这个执行时,responseFiled.text被设定为dlsym(...): symbol not found。这意味着dlopen有效但无效dlsym。我使用转储二进制文件中的符号nm看到了_getstring存在。我检查了manual http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/dlopen.3.html for dlsym它说我不应该在名称中添加下划线。无论如何添加它并不能解决问题。我究竟做错了什么?

我曾问过类似的问题here https://stackoverflow.com/questions/4954361/calling-a-function-by-name-input-by-user关于在 Objective-C 中按名称调用函数,然后按照答案在 Mac 上成功尝试,所以这个问题似乎是 iOS 特有的。


我认为问题在于 iOS 上不支持 dlopen,即使您静态链接库也是如此。你should能够使用

dlsym(RTLD_SELF, "getstring");

因为 RTLD_SELF 意味着“开始查看调用 dlsym 的图像”。根据您使用 dlopen() 的方式,它应该完成相同的任务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 中使用 dlsym 按名称调用函数 的相关文章

随机推荐

  • Word宏,存储当前选择(VBA)

    我有一个 Word 文档 其中包含大约 4000 个表单字段 之后我必须将其导出到数据库 问题是 4000 个字段中没有一个在 书签 字段中包含信息 因此我无法获取其中存储的信息 我正在尝试创建一个宏来帮助编写书签 FormField Na
  • 在redis中存储时间序列

    我需要将一些时间序列数据存储到redis 中 我有 unix 时间戳 并且需要关联一个值 时间戳 值 我尝试将时间戳作为分数 这样我可以对时间戳进行 zrange 并将值作为成员进行排序 127 0 0 1 6379 gt ZADD tim
  • mysql LOAD DATA INFILE NA 到 NULL 转换

    mysql LOAD DATA INFILE 命令中有一个选项可以获取 tsv文件作为 mysql 的输入 LOAD DATA INFILE 并将该文件中的每个 NA 字段转换为 mysql 中的 NULL 作为奖励 还能够采取多个不同的
  • Woocommerce:删除“附加信息”选项卡

    我试图在该网站的产品页面上做两件事 https lovesometea com product green coconut https lovesometea com product green coconut 1 删除 附加信息 选项卡
  • 在反应中禁用语义按钮

    如何在反应中动态地将语义按钮设置为禁用
  • java的hashCode()方法是如何工作的?

    我很好奇java如何使用生成哈希值哈希码 http java sun com j2se 1 3 docs api java lang Object html hashCode 对象 API 的方法 The hashCode of Objec
  • *.bat 和 *.cmd 文件有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 Windows 批处理文件 bat 与 cmd https stackoverflow com questions 148968 windows batch files bat vs cmd Hi 我
  • GCC `-fsanitize=bounds` 与 `std::array` 的奇怪行为

    我正在尝试使用以下命令找出代码中的越界问题 fsanitize bounds选项 但我面临着奇怪的行为 例如在下面的代码中 include
  • 插入文本会出现对象集合错误

    我想将 SQL 中的每一行插入组合框 其中 EmployeeID 将是组合框值 EmployeeFirstName EmployeeLastName 将是组合框项的文本 然而这条线 给我这个错误 错误 1 与 System Windows
  • C++ 中的原子指针以及在线程之间传递对象

    我的问题涉及std atomic
  • 如何防止 Safari 拦截 ajax 请求的 401 响应

    我在 Safari 扩展中遇到以下问题 我要求用户提供 Web 服务的用户名 密码 并发送一个快速请求以验证凭据是否正确 如果不是 该服务将响应 401 我认为它应该如此 问题是 Safari 似乎在我的 javascript 代码可以处理
  • Android Opengl-es加载非2的幂纹理

    我有一个在 android 中反复使用的应用程序 它使用 opengl es 目前我从位图加载纹理 如下所示 Load up and flip the texture then dispose the temp Bitmap temp Bi
  • 防止 jquerymobile 多选控件的对话框视图包含大量选项

    所以我喜欢 jquery mobile 的自定义多选控件 并且想使用它 所以请不要建议放置 data role none 但如果选项列表很长 我只是不希望在新的对话框窗口中打开选择列表的默认行为 我不希望这种行为的原因是它在 ipad 上运
  • 在 Jenkins Pipeline/Jenkinsfile 中获取 git 分支名称

    我创建了一个詹金斯管道 它正在从 scm 中提取管道脚本 我将分支说明符设置为 all 因此它建立在对任何分支的任何更改的基础上 如何从 Jenkinsfile 访问导致此构建的分支名称 我尝试过的所有内容都回显为空 除了 sh retur
  • 如何从AsyncTask返回数据到主线程

    我想将 Jsonobject 返回到主线程 但是当我尝试运行代码时 它返回以下错误 02 06 06 14 36 490 E AndroidRuntime 769 FATAL EXCEPTION main 02 06 06 14 36 49
  • 循环不打印函数输出

    我正在尝试创建一个循环 它可以为我提供一个带有一个截距和三个系数的回归分析的自举置信区间 对引导函数进行编程效果很好 问题是我必须使用索引 如index 1 来处理函数boot ci 中回归的每个对象 因为boot ci 不知道我的回归模型
  • C - 这个语法是关于什么的? <<

    请问这个符号是什么意思 我想要研究的东西的名称 谢谢 它移动整数 1 中的位var位置向左 所以实际上它计算的是 2 的幂var See 维基百科上有关位移位的文章 http en wikipedia org wiki Bit shift
  • 如何访问GCE VM实例的控制台?

    如何访问 Google Compute Engine VM 实例的控制台 Answer recommended by Google Cloud collectives google cloud Collective 要查看控制台输出 只读
  • 如何在 Thymeleaf 中迭代 X 项?

    我有模板 四个人用的li我应该拥有的元素ul元素 我该怎么做 现在我有类似的东西 div ul li a img src template images garden1 jpg alt Image a h2 h2 p p li ul div
  • iOS 中使用 dlsym 按名称调用函数

    在 iOS 中不能通过名称调用函数吗 我有一个名为的 C 函数getstring 我这样称呼它 void handle dlopen NULL RTLD NOW if handle fp func dlsym handle getstrin