2012-04-16 69 views
2

我試圖實現dyld所做的一些部分,我有點卡在存根蹦牀。如何解決dyld導入的符號?

考慮以下ARM指令:

BL 0x2fec 

它與分支鏈路(子過程調用)0x2fec。我意識到__TEXT段中有一段__symbolstub1開始於0x2fd8,所以它跳轉到__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任何想法?

回答

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. 的偏移表被存儲在保留1 間接符號;
  5. 的索引間接符號表被計算爲

    指數= sect.reserved1 +(vmaddr - sect.addr)/ bytesize;

  6. 中的符號表中的符號在符號[indirect_symbols [索引]中找到。

+0

我想這可能是有趣的你閱讀這些職位(形容英特爾架構,但無論如何): http://www.codeproject.com/Articles/187181/Dynamic-Linking-of-Imported -Mun-O功能 http://www.codeproject.com/Articles/187192/Redirection-of-Imported-Functions-in-Mach-O 或俄語: http://habrahabr.ru /後/ 115558 – shoumikhin 2012-06-08 05:48:52

相關問題