• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - CFBundleGetFunctionPointerForName 和 dlsym 为导出的函数返回 NULL

[复制链接]
菜鸟教程小白 发表于 2022-12-13 02:35:21 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个 JavaScriptCore 框架的分支,我在其中添加了一个自己的函数,该函数被导出。框架编译只是find。在框架上运行 nm 会发现函数 (JSContextCreateBacktrace_unsafe) 确实已导出:

Leo-Natans-Wix-MPB:JavaScriptCore.framework lnatan$ nm -gU JavaScriptCore.framework/JavaScriptCore | grep JSContextCreateBacktrace
00000000004cb860 T _JSContextCreateBacktrace
00000000004cba10 T _JSContextCreateBacktrace_unsafe

但是,我无法使用 CFBundleGetFunctionPointerForNamedlsym 获取该函数的指针;两者都返回 NULL。起初,我使用 dlopen 打开我的框架,然后尝试使用 CFBundleCreateCFBundleGetFunctionPointerForName 但也返回 NULL。

这是什么原因造成的?

更新

发生了一些可疑的事情。我重命名了其中一个 JSC 函数,nm 反射(reflect)了这一点。但是,dlsym 仍然能够找到具有原始名称的函数,而不是重命名的函数。



Best Answer-推荐答案


这很难追踪,因为它高度依赖于您的特定环境和情况,但您很可能遇到此问题,因为系统镜像已经加载并且您没有更改框架。

如果您查看 dyld/dyldAPIS.cpp:1458dlopen 的源代码,您会注意到传递给 dyld 的上下文是使用 matchByInstallName = true 配置的。然后将此上下文传递给 load,后者执行图像加载所需的各个阶段。有几个阶段值得注意:

  • loadPhase2 in dyld/dyld.cpp:2896提取框架路径的结尾并在搜索路径中搜索

  • loadPhase5check in dyld/dyld:2712遍历所有加载的图像并确定其中是否有匹配的安装名称,如果有,则返回该名称而不是加载新的。

  • loadPhase5load in dyld/dyld:2601如果之前的任何步骤都没有加载/找到图像,则最终加载图像。 (值得注意的是,首先执行 loadPhase5check,因为图像加载是一个两遍过程。)

鉴于以上所有情况,我会尝试将您的框架重命名为 JavaScriptCore.framework 之外的其他名称。根据系统框架和您的框架的安装名称,我还建议更改安装名称。 (有大量的博客文章和 StackOverflow 帖子记录了如何使用 install_name_tool -id 进行此操作。)

关于ios - CFBundleGetFunctionPointerForName 和 dlsym 为导出的函数返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46148634/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap