如何从共享库中提取虚拟表信息
How to extract Virtual Table informations from a shared library?
我正在实现一个性能分析工具。我正在做的一件事是估计函数调用的成本。为了做到这一点,我需要知道给定的函数在共享库中是否是虚拟的。
为此,我有权访问共享库程序集。我还有一个执行的调用图。在执行过程中我不能做任何事情,必须在执行后使用我可以从调用图和共享库中获得的信息进行分析。
我想到的唯一方法是从库中提取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存储在只读部分,正如我们所期望的那样。谢谢你的建议。
相关文章:
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 虚拟决赛作为安全
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么istream不支持右值提取
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在C++中获得"静态纯虚拟"功能?
- C++无法定义虚拟函数 OUTER 类和头文件
- 如何设置一个范围来提取我想要获得的信息
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 大小虚拟继承中的派生类
- 视觉工作室项目.提取源文件夹名称
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- modern.ie 从网站中提取虚拟机 JSON 数据
- 如何从虚拟磁盘中提取文件
- 如何从共享库中提取虚拟表信息