gpt4 book ai didi

ios - Mach-O 符号 stub (IOS)

转载 作者:可可西里 更新时间:2023-11-01 03:28:13 25 4
gpt4 key购买 nike

我正在尝试了解 Mach-o 文件的工作原理,并在可用的在线资源(特别是此处的 Apple 页面:http://developer.apple.com/library/mac/#documentation/developertools/conceptual/MachORuntime/Reference/reference.html)方面取得了很大进展,但我在理解上遇到了障碍符号 stub 如何工作。

使用“otool -l”我看到以下部分:

Section
sectname __symbolstub1
segname __TEXT
addr 0x00005fc0
size 0x00000040
offset 20416
align 2^2 (4)
reloff 0
nreloc 0
flags 0x80000408

然而,当我在十六进制编辑器中查看二进制文件中的数据时,我看到以下 4 个字节一次又一次地重复:

00005FC0  38 F0 9F E5 38 F0 9F E5  38 F0 9F E5 38 F0 9F E5  88
00005FD0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88
00005FE0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88
00005FF0 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 38 F0 9F E5 88

这看起来有点像 LDR,它将 PC 增加固定数量,但我不明白为什么符号表中每个条目的数量都相同。

如果有人可以阐明为什么会这样,或者提供任何达到这种低水平的资源,请告诉我。

谢谢!

最佳答案

我将描述当前 iOS 的情况,它在旧版本中有些不同。

符号 stub 确实将函数指针加载到 PC 中。对于标准的“惰性”(按需)导入,指针驻留在 __lazy_symbol 部分中,最初指向 __stub_helper 部分中的辅助例程,例如:

__symbolstub1 _AudioServicesAddSystemSoundCompletion
__symbolstub1 LDR PC, _AudioServicesAddSystemSoundCompletion$lazy_ptr
__symbolstub1 ; End of function _AudioServicesAddSystemSoundCompletion

__lazy_symbol _AudioServicesAddSystemSoundCompletion$lazy_ptr DCD _AudioServicesAddSystemSoundCompletion$stubHelper

__stub_helper _AudioServicesAddSystemSoundCompletion$stubHelper
__stub_helper LDR R12, =nnn ; symbol info offset in the lazy bind table
__stub_helper B dyld_stub_binding_helper

函数 dyld_stub_binding_helper__stub_helper 部分中的第一个函数,本质上只是 dyld 中 dyld_stub_binder 函数的跳板,传递给它就是我所说的“符号信息偏移”值。该值是惰性绑定(bind)信息流中的偏移量(由 LC_DYLD_INFO 或 LC_DYLD_INFO_ONLY 加载命令指向),这是一种带有 dyld 命令的字节码流。惰性导入的典型顺序如下所示:

72: BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB(M, 0xYYYYY)
19: BIND_OPCODE_SET_DYLIB_ORDINAL_IMM(NNNN)
40: BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM(0x00, '_AudioServicesAddSystemSoundCompletion')
90: BIND_OPCODE_DO_BIND()

这里 dyld 会做以下事情:

  1. 从中查找名为“_AudioServicesAddSystemSoundCompletion”的函数加载中列出的动态库列表中的动态库编号 NNNN命令。
  2. 查找可执行文件的段号 M(很可能是 __DATA)
  3. 在偏移量 YYYYY 处写入函数指针。
  4. 跳转到查找到的地址,以便实际函数执行其工作

写入的地址恰好是 _AudioServicesAddSystemSoundCompletion$lazy_ptr 插槽。因此,下次调用 _AudioServicesAddSystemSoundCompletion 时,它将直接跳转到导入的函数,而无需通过 dyld。

注意:您不应立即查看文件中的偏移量 05fc0。 addr 字段是虚拟地址,您应该查找包含段命令并查看它从什么 VA 开始以及它的文件偏移量是多少,然后进行数学运算。通常 __TEXT 段从 1000 开始。

但是,实际的符号 stub 看起来确实像您粘贴的那样,可能您有一个胖头,胖头占用前 1000 个字节,所以偏移量对齐。

关于ios - Mach-O 符号 stub (IOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8825537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com