2

私は dyld が行うことのいくつかの部分を実装しようとしていますが、スタブ トランポリンで少し立ち往生しています。

次の ARM 命令を考えてみましょう。

BL  0x2fec

0x2fecへのリンク(サブプロシージャコール)で分岐します。0x2fd8 で始まる __TEXT セグメントにセクション __symbolstub1 があることを認識しているため、__symbolstub1 内の 20 バイトにジャンプします。

今、シンボルがあります

(undefined) external _objc_autoreleasePoolPush (from libobjc)

LC_SYMTAB ロード コマンドで解決しました。提供された既知のアドレスはありません。実際、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 のはるか下にあります。そのため、セクションへの参照が欠落しています。

0x2fec 仮想アドレスを _objc_autoreleasePoolPush にマップする方法についてのアイデアはありますか?

4

1 に答える 1

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. シンボル テーブルのシンボルは、symbols[indirect_symbols[index]] にあります。

于 2012-04-16T19:16:10.197 に答える