什么是关于合成的链接器中的“紧凑展开信息”的意思

时间:2016-12-07 05:25:50

标签: xcode linker text-segmentation

当我分析由xcode生成的链接映射文件时,在链接器合成部分中,有一个名为“compact unwind info”的数据。

compact unwind info 858.57KB    858572  Unchecked

大约需要858kb的空间。 我想知道这个空间里的实际数据是什么。 有没有办法减少这个尺寸?

链接器合成的总输出部分:

compact unwind info 858.57KB
helper helper   24B
objc image info 8B
non-lazy-pointer    8B
non-lazy-pointer-to-local: dyld_stub_binder 8B
non-lazy-pointer-to-local: _vm_page_size    8B
non-lazy-pointer-to-local: _tanh    8B
non-lazy-pointer-to-local: _tan 8B
non-lazy-pointer-to-local: _strdup  8B
non-lazy-pointer-to-local: _strcmp  8B
non-lazy-pointer-to-local: _sinh    8B
non-lazy-pointer-to-local: _sin 8B
non-lazy-pointer-to-local: _realloc 8B
non-lazy-pointer-to-local: _protocol_getName    8B
non-lazy-pointer-to-local: _object_getIndexedIvars  8B
non-lazy-pointer-to-local: _objc_readClassPair  8B
non-lazy-pointer-to-local: _objc_lookUpClass    8B
non-lazy-pointer-to-local: _objc_getRequiredClass   8B
non-lazy-pointer-to-local: _objc_getProtocol    8B
non-lazy-pointer-to-local: _objc_getMetaClass   8B
non-lazy-pointer-to-local: _objc_getClass   8B
non-lazy-pointer-to-local: _objc_copyClassNamesForImage 8B
non-lazy-pointer-to-local: _objc_allocateClassPair  8B
non-lazy-pointer-to-local: _malloc  8B
non-lazy-pointer-to-local: _mach_task_self_ 8B
.....

1 个答案:

答案 0 :(得分:2)

展开信息是在抛出/引发异常时展开堆栈所需的信息。展开堆栈涉及确定帧指针,堆栈指针,返回地址和任何已保存寄存器的存储位置,以便可以恢复前一帧的状态。对于任何给定的堆栈帧,它还确定是否存在展开处理函数,以处理" catch"和#34;最后" C ++和Objective-C等语言中的异常处理功能。

当前帧的所有信息都是从指令指针确定的。当执行从第一条指令开始执行函数时,细节会发生变化,因为每条指令都可以修改相关寄存器和/或将已保存的寄存器值推入或弹出堆栈。

展开信息描述了如何从指令指针确定在哪里找到所有这些值。

可以嵌入二进制文件中的各种形式的展开信息。一种常见的形式是DWARF展开信息。这相当空间效率低下。 Apple开发了紧凑的展开信息,因为不管你信不信,它实际上占用的空间更少。

可以找到紧凑展开信息格式的详细信息here