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

How to extract Virtual Table informations from a shared library?

本文关键字:提取 虚拟 信息 共享      更新时间:2023-10-16

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

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

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

我试过

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

但这只给了我一个好的vtable的地址(至少我认为是一个),而这个地址没有给我任何线索。

共享库是用gcc 4.3.5 编译的

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

非常感谢

最后我们找到了一种方法。事情并没有那么复杂。在我们的例子中,虚拟表地址位于ELF共享库文件的.dynsym部分。然后在.rea.dyn部分可以获得虚拟表的内容。因此,我们必须找到每个虚拟表的地址和大小,然后只需阅读.rea.dyn部分即可找到函数。

当然,这绝对不是可移植的,但在我们的情况下,这不是问题。

0000000000400e80 w O.rodata 0000000000000020 vtable for Test

我使用命令"objdump-xa.out|c++filt"获得上面的输出,很明显,vtable存储在只读部分,正如我们所期望的那样。谢谢你的建议。