2012-04-16 45 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

相关问题