Linker 如何解析dyld导入的符号?

Linker 如何解析dyld导入的符号?,linker,objective-c-runtime,mach-o,dyld,otool,Linker,Objective C Runtime,Mach O,Dyld,Otool,我正试图实现dyld所做的部分工作,但我有点被存根蹦床卡住了 考虑以下ARM说明: BL 0x2fec 它通过链接(子过程调用)分支到0x2fec。我知道事实上,uuu文本段中有一个从0x2fd8开始的部分uu symbolstub1,因此它是在u symbolstub1中跳转到20字节 现在,有一个符号 (undefined) external _objc_autoreleasePoolPush (from libobjc) 我已经通过LC_SYMTAB load命令解决了这个问题。没有

我正试图实现dyld所做的部分工作,但我有点被存根蹦床卡住了

考虑以下ARM说明:

BL  0x2fec
它通过链接(子过程调用)分支到0x2fec。我知道事实上,uuu文本段中有一个从0x2fd8开始的部分uu symbolstub1,因此它是在u symbolstub1中跳转到20字节

现在,有一个符号

(undefined) external _objc_autoreleasePoolPush (from libobjc)
我已经通过LC_SYMTAB load命令解决了这个问题。没有提供已知地址。我知道,作为一个事实,0x2fec地址是自动释放池推送的蹦床,但我无法通过任何方式证明它

我已经检查了LC_DYLD_INFO_ONLY命令,在我找到的lazy_绑定符号中有一点提示:

{:offset=>20, :segment=>2, :library=>6, :flags=>[], :name=>"_objc_autoreleasePoolPush"}
其中名称和偏移量与我的完全匹配,并且库#6是“/usr/lib/libobjc.A.dylib”,这也很完美。现在的问题是,段2是文本,但是文本从0x1000开始,而符号tub1在0x2fd8处。所以我遗漏了一些关于第节的参考资料


有没有关于如何将0x2fec虚拟地址映射到_objc_autoreleasepoolphush的想法?

嘿,再深入一点,我在LC_DYSYMTAB的间接符号中找到了它

现在,答案很长

  • 为给定地址查找一个部分
  • 该部分应为S_非(非)惰性(符号)指针、S_惰性(符号)指针、S_惰性(动态)符号(符号)指针、S_线程(局部)变量(指针或S(符号)存根)类型
  • 如果节类型为S_SYMBOL_存根,则字节大小存储在reserved2中,否则视为等于4
  • 间接符号表中的偏移量存储在reserved1中
  • 间接符号表的索引计算如下:

    索引=sect.reserved1+(vmaddr-sect.addr)/字节大小

  • 符号表中的符号位于符号[间接符号[索引]]


  • 我想你可能会感兴趣地阅读这些帖子(描述英特尔架构,但无论如何):或者用俄语: