2017-09-11 4 views
2

JavaScriptCoreフレームワークのフォークがあります。ここにはエクスポートされた独自の関数が追加されています。フレームワークは単にfindをコンパイルします。フレームワーク上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 

をしかし、私はCFBundleGetFunctionPointerForNameまたはdlsymを使用して、その関数のポインタを取得することができません。どちらも返信NULLです。最初にdlopenを使用してフレームワークを開き、CFBundleCreateを使用し、次にCFBundleGetFunctionPointerForNameを使用しようとしましたが、NULLも返します。

この原因は何ですか?

更新

生臭い何かが起こっています。私はJSC関数の1つに名前を変更し、nmはこれを反映しています。ただし、dlsymはまだ名前を変更したのではなく、元の名前の関数を見つけることができます。

答えて

2

特定の環境や状況に大きく依存するため、これを追跡することは困難ですが、システムイメージが既に読み込まれていて、名前を変更していないため、この問題が発生している可能性が非常に高いです枠組み。

dlopenのソースコードをdyld/dyldAPIS.cpp:1458に見ると、dyldに渡されるコンテキストがmatchByInstallName = trueであることがわかります。次に、このコンテキストは、画像ロードに必要な様々なステージを実行するloadに渡されます。注目すべきいくつかの段階があります。

dyld/dyld.cpp:2896
  • loadPhase2はすべて読み込んだ画像の上にdyld/dyld:2712繰り返し処理で

  • loadPhase5check検索パスにそのためのフレームワークのパスと検索の終了を抽出し、任意のかどうかを判断しますそれらのうち、インストール名が一致している場合は、新しい名前をロードする代わりにその名前を返します。

  • は、最後のステップでロード/検出されなかった画像を最後にロードします。 (画像の読み込みが2つのパスプロセスであるので、それはloadPhase5checkを注目に値しますが、最初に実行されます。)

は、上記のすべてを考えると、私はほかJavaScriptCore.framework何かにあなたのフレームワークの名前を変更してみてくださいと思います。システムフレームワークとフレームワークの両方のインストール名によっては、インストール名を変更することもお勧めします。 (install_name_tool -idを使用してこれを行う方法を文書化したブログ記事やStackOverflowの投稿がたくさんあります)

+0

まさに私が必要としていたものです。丁寧な答えをありがとう! –

関連する問題