gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:22:37 25 4
gpt4 key购买 nike

我有一个 JavaScriptCore 框架的分支,我在其中添加了一个我自己的导出函数。框架编译才发现。在框架上运行 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 打开我的框架,然后尝试使用 CFBundleCreate 然后使用 CFBundleGetFunctionPointerForName 但同样返回 NULL。

这可能是什么原因造成的?

更新

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

最佳答案

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

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

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

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com