我试图实现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任何想法?
我想这可能是有趣的你阅读这些职位(形容英特尔架构,但无论如何): 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