2011-06-16 77 views
2

我正在实施性能分析工具。我正在做的一件事是估计函数调用的成本。为了做到这一点,我需要知道给定的函数是否在共享库中是虚拟的。如何从共享库中提取虚拟表信息?

为此,我可以访问共享库程序集。我也有一个执行的调用图。在执行过程中我不能做任何事情,分析必须在执行后使用我可以从调用图和共享库中获得的信息来完成。

我想过的唯一方法是从库中提取vtable并查看我的函数是否在vtable中,但我没有找到从程序集中提取类的vtable的方法。

我试图

readelf -s -W lib.so | c++filt | grep vtable 

但只要你给我很好的虚函数表的地址(至少我认为这是一个),而这个地址会导致我一事无成。

共享库是用gcc编译4.3.5

是否有人知道一种方式来获得这种虚函数表?或者至少有人知道一种方法来知道函数是否在共享库中是虚拟的?

非常感谢

+2

出于好奇,为什么你需要知道,除非你试图从一个特定的类继承并重写一个方法? (在这种情况下,您可以在标题定义中找到信息) – totowtwo 2011-06-16 22:05:31

+0

我正在使用性能分析工具,并且需要知道函数是否为虚拟来分析对此函数的调用的开销。我无法访问源文件 – 2011-06-16 22:13:28

+0

@Baptiste - 为什么不尝试跟踪调用的实际执行,并查看它是直接链接还是使用函数地址的指针引用? – littleadv 2011-06-16 22:27:22

回答

3

最后我们找到了一种方法来做到这一点。这并不复杂。在我们的例子中,虚拟表地址位于ELF共享库文件的.dynsym部分。然后,.rela.dyn部分提供了虚拟表格的内容。所以我们必须找到每个虚拟表的地址和大小,然后阅读.rela.dyn部分来查找函数。

当然,这是绝对不便携,但是对我们来说,这不是一个问题。

0

0000000000400e80 W 0至.RODATA 0000000000000020测试

我用命令虚函数表“objdump的-x的a.out | C++ FILT”,并得到上面的输出,显然存储在只读部分的虚函数表我们的期望。感谢您的建议。