在观看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如何计算它?
谢谢!
答案 0 :(得分:1)
Nick Kledzik的回答:
编译器经常将函数对齐以从对齐地址开始(例如8或16字节)。因此,在函数结束之后和下一个函数开始之前有填充字节(通常是NOP)。
dwarfdump可以访问具有函数大小信息的调试信息。因此,dwarfdump可以显示函数的大小,而不会在末尾添加对齐填充。而链接器只是查看下一个符号地址。链接器挖掘调试信息以获取函数的真实大小没有多大意义,因为在编写输出时,链接器必须对齐下一个函数,该函数只会添加填充字节。
我希望能帮助那些有同样困惑的人。