2014-08-28 83 views
2

在观看mail list之前,我对Mach-o文件中符号表“大小”的缺乏感到困惑。而且我发现在源文件中的解决方案张贴在那封电子邮件,其中指出:如何获得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)输出中的符号表时,我再次感到困惑。矮人转储符号表中符号的结束地址与我程序输出的结果不同。我解析出的符号表有问题吗?或者有其他解决方法吗?

一些从我的程序的输出:

<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 

所以,如果我用在“MachONormalizedFileToAtoms.cpp”的方式来计算该符号的结束地址(向前查找具有下一个最高地址的符号),结果必须与dwarfdump的输出不同。还有人知道矮人是如何计算的吗?

谢谢!

+0

任何人都可以帮忙吗? – 2014-08-28 14:10:12

回答

1

从由尼克Kledzik答案:

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

dwarfdump可以访问调试信息,它具有函数的大小信息。所以dwarfdump可以在最后没有对齐填充的情况下显示函数的大小。链接器只是查看下一个符号地址。链接器通过调试信息来获取函数的真实大小并没有太多意义,因为在写入输出时,链接器必须对齐下一个函数,该函数只会添加填充字节。

我希望可以帮助其他人有同样的困惑。

相关问题