2012-04-16 7 views
2

私はdyldがやっていることのいくつかの部分を実装しようとしています、そして、私はスタブトランポリンでちょっと立ち往生しています。 0x2fecへのリンク(サブプロシージャコール)とインポートされたシンボルのdyldを解決するにはどうすればよいですか?

BL 0x2fec 

これブランチ:

は、以下のARM命令を考えてみましょう。私は、0x2fd8から始まる__TEXTセグメントにセクション__symbolstub1があることを知っています。したがって、__symbolstub1の中の20バイトにジャンプします。

さて、私はLC_SYMTAB loadコマンドを通じて解決したシンボル

(undefined) external _objc_autoreleasePoolPush (from libobjc) 

があります。既知のアドレスはありません。私は事実として、0x2fecアドレスが_objc_autoreleasePoolPushのトランポリンだと知っていますが、私はそれをどのような手段でも証明することはできません。

私はLC_DYLD_INFO_ONLYコマンドをチェックしました、と私は私が見つけたlazy_bindシンボルで、そこにわずかなヒントを持っていた:

{:offset=>20, :segment=>2, :library=>6, :flags=>[], :name=>"_objc_autoreleasePoolPush"} 
名とオフセットは、私が正確に持っているものと一致

、およびライブラリ#6は "/usr/lib/libobjc.A.dylib"です。これも完璧です。今問題はセグメント#2が__TEXTですが、__TEXTは0x1000から始まり、__symbolstub1は0x2fd8のところにあります。だから私はセクションにいくつかの参照を欠場しています。

どのように私は_objc_autoreleasePoolPushに0x2fec仮想アドレスをマップすると思いますか?

答えて

1

ちょっと掘り下げて、LC_DYSYMTABの間接的なシンボルで見つけました。

今や長い答えです。

  1. 特定のアドレスのセクションを検索してください。
  2. セクションは、タイプ S_NON_LAZY_SYMBOL_POINTERS、S_LAZY_SYMBOL_POINTERS、S_LAZY_DYLIB_SYMBOL_POINTERS、S_THREAD_LOCAL_VARIABLE_POINTERS又はS_SYMBOL_STUBSでなければなりません。
  3. セクションタイプがS_SYMBOL_STUBSの場合、バイトサイズはreserved2に格納されます。それ以外の場合は4とみなされます。
  4. 間接シンボルテーブルへのオフセットは、reserved1に格納されます。
  5. 間接シンボルテーブルへのインデックスを

    インデックス= sect.reserved1 +(vmaddr - sect.addr)として算出される

    /バイトサイズ。

  6. 記号表の記号は、記号[indirect_symbols [index]]にあります。

+0

私は(とにかくIntelアーキテクチャを説明したが、)あなたはこれらの記事を読んですることは興味深いものになることができると思います: http://www.codeproject.com/Articles/187181/Dynamic-Linking-of-Imported機能-in-Mach-O http://www.codeproject.com/Articles/187192/Redirection-of-Imported-Functions-in-Mach-O またはロシア語: http://habrahabr.ru/post/115558 – shoumikhin

関連する問題