如何获得Mach-O文件符号表中符号的大小?
问题描述:
在观看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的输出不同。还有人知道矮人是如何计算的吗?
谢谢!
答
从由尼克Kledzik答案:
编译器通常对齐功能中的对齐的地址(例如8个或16字节)开始。所以,在函数结束之后和下一个函数开始之前有填充字节(通常是NOP)。
dwarfdump可以访问调试信息,它具有函数的大小信息。所以dwarfdump可以在最后没有对齐填充的情况下显示函数的大小。链接器只是查看下一个符号地址。链接器通过调试信息来获取函数的真实大小并没有太多意义,因为在写入输出时,链接器必须对齐下一个函数,该函数只会添加填充字节。
我希望可以帮助其他人有同样的困惑。
任何人都可以帮忙吗? – 2014-08-28 14:10:12