如何在Mach-O文件的符号表中获取符号的大小?

时间:2014-08-28 05:36:49

标签: mach-o

在观看mail list之前,我对缺少"尺寸"感到困惑。 Mach-o文件中的符号表。我在该电子邮件中发现了源文件中的解决方案,其中注意到:

//Mach-O symbol table does have size in it
//so need to scan ahead to find symbol with next highest address.

但是当我解析Mach-O文件中的符号表(我从symtab_command和以下nlists中获取符号表)并尝试以同样的方式计算一个全局符号的大小时,我又感到困惑了当我从dwarfdump(dwarfdump -ae)的输出中比较符号表时。来自dwarfdump的符号表中符号的结束地址与我的程序输出的结果不同。我解析出的符号表有问题吗?或者还有其他方法可以解决这个问题吗?

我的程序的一些输出:

<start address> <section index>    <method>
0x0006d030        1                            ___arclite_objc_autoreleasePoolPop 
0x0006d048        1                            _patch_lazy_pointers 
0x0006d1f0        1                            ___arclite_objc_autoreleasePoolPush

dwarfdump输出的相应部分:

0x0014a37b: [0x0006d030 - 0x0006d046) __arclite_objc_autoreleasePoolPop 
0x0014a122: [0x0006d048 - 0x0006d1ee) patch_lazy_pointers 
0x0014a3a0: [0x0006d1f0 - 0x0006d212) __arclite_objc_autoreleasePoolPush

因此,如果我使用&#34; MachONormalizedFileToAtoms.cpp&#34;计算符号的结束地址(向前看以找到具有下一个最高地址的符号),结果必须与dwarfdump的输出不同。有没有人知道dwarfdump如何计算它?

谢谢!

1 个答案:

答案 0 :(得分:1)

Nick Kledzik的回答:

  

编译器经常将函数对齐以从对齐地址开始(例如8或16字节)。因此,在函数结束之后和下一个函数开始之前有填充字节(通常是NOP)。

     

dwarfdump可以访问具有函数大小信息的调试信息。因此,dwarfdump可以显示函数的大小,而不会在末尾添加对齐填充。而链接器只是查看下一个符号地址。链接器挖掘调试信息以获取函数的真实大小没有多大意义,因为在编写输出时,链接器必须对齐下一个函数,该函数只会添加填充字节。

我希望能帮助那些有同样困惑的人。