2017-09-11 58 views
2

我有一個JavaScriptCore框架的分支,我添加了一個我自己的函數,該函數被導出。該框架編譯只是找到。在框架運行nm揭示了功能(JSContextCreateBacktrace_unsafe)的確是出口:CFBundleGetFunctionPointerForName和dlsym爲導出的函數返回NULL

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反映了這一點。但是,dlsym仍然能夠找到具有原始名稱的功能,而不是重命名。

回答

2

由於系統映像已經被加載,並且沒有更改名稱,所以很難追蹤這個問題,因爲它高度依賴於您的特定環境和環境,但很可能您遇到了此問題。該框架。

如果您在dyld/dyldAPIS.cpp:1458中查看dlopen的源代碼,您會注意到傳遞給dyld的上下文使用matchByInstallName = true進行配置。然後將該上下文傳遞給執行圖像加載所需的各個階段的load。還有值得一提的幾個階段:

  • loadPhase2dyld/dyld.cpp:2896提取框架路徑的結束,並搜索其在搜索路徑

  • dyld/dyld:2712遍歷所有加載的圖像loadPhase5check並確定是否有任何其中有一個匹配的安裝名稱,如果有,則返回該名稱而不是加載新名稱。

  • loadPhase5load in dyld/dyld:2601如果以前的任何步驟沒有加載/找到圖像,它將最終加載圖像。 (值得注意的loadPhase5check首先被執行,因爲圖像加載是一個雙向的過程。)

鑑於所有上述情況,我想嘗試重命名你的框架的東西,除了JavaScriptCore.framework。根據系統框架和框架的安裝名稱,我還建議更改安裝名稱。 (有很多博客文章和StackOverflow文章記錄瞭如何使用install_name_tool -id來完成此操作。)

+0

正是我需要的。謝謝你的答案! –