私は 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 にマップする方法についてのアイデアはありますか?