gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:56:54 24 4
gpt4 key购买 nike

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

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

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

我试过了

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

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

共享库是用gcc 4.3.5编译的

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

非常感谢

最佳答案

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

当然,这绝对不是可移植的,但在我们的例子中,这不是问题。

关于c++ - 如何从共享库中提取虚拟表信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6379166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com