如何从共享库中提取虚拟表信息?

时间:2011-06-16 22:02:36

标签: c++ gcc reverse-engineering

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

为此,我可以访问共享库程序集。我还有一个执行的调用图。我在执行过程中无法做任何事情,必须在执行后使用我可以从调用图和共享库中获取的信息进行分析。

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

我试过

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

但这只能给我一个好的vtable的地址(至少我认为它是一个),这个地址让我无处可去。

共享库使用gcc 4.3.5

编译

有人知道获取此vtable的方法吗?或者至少有人知道一种方法来了解某个功能在共享库中是否是虚拟的?

非常感谢

2 个答案:

答案 0 :(得分:3)

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

当然,这绝对不是便携式的,但在我们的情况下,这不是问题。

答案 1 :(得分:0)

<00> 0000000000400e80 w O .rodata 0000000000000020 vtable for Test

我使用命令“objdump -x a.out | c ++ filt”并得到上面的输出,显然vtable存储在我们期望的只读部分。谢谢你的建议。