【问题标题】:Undecorated Microsoft Symbol: SomeClass::`vftable'{for `Foo::Bar'}未修饰的 Microsoft 符号:SomeClass::`vftable'{for `Foo::Bar'}
【发布时间】:2013-02-21 14:21:25
【问题描述】:

我正在使用来自 dbghelp 的 UnDecorateSymbolNameW 来取消装饰 Microsoft 符号名称。当使用UNDNAME_COMPLETE 取消装饰时,符号名称有时可能会包含一些编译器附加的信息,我的理解是。例如,一个 vftable 符号有时可以有一个大括号块,其中包含一个 for 关键字,后跟一个类/接口名称,例如

SomeClass::'vftable'{for 'Foo::Bar'}

谁能告诉我名字的"{for 'Foo::Bar'}" 部分是什么意思?

另外有没有人知道一些关于这方面的文档,所以我可以阅读,因为我找不到任何东西。

非常感谢!

【问题讨论】:

  • 您不会找到此文档,这些是编译器实现细节,可能会发生变化。由于多重继承,一个类可以有多个 v-table。后缀确保它们的符号是唯一的。

标签: windows symbols dbghelp


【解决方案1】:

您的类SomeClass 使用多重继承,并且它有多个带有虚拟方法的基类。因此,SomeClass 需要多个 vtable(每个具有虚拟方法的基类一个)。 {for 'Foo::Bar'} 告诉您您拥有哪个 vtable。在本例中,它是 Foo::Bar 基类的 vtable。

(这从名字上应该是不言而喻的。)

【讨论】:

  • 谢谢,是的,当你把它拼出来时,这确实是有道理的。可惜没有这些东西的文档。再次感谢。
  • 这都是编译器内部的东西。编译器内部的东西往往不会记录在案,因为它可以随时更改。
  • 很公平,我正在尝试从符号中解析尽可能多的信息,以便为某些东西生成元模型,所以我对这些东西的规范很感兴趣。但我理解为什么没有正式的规范/文档。
  • 确实,早期版本的编译器并没有说{for 'Foo::Bar'}——它只是给每个vtable 赋予了相同的名称。谁知道呢,未来版本的编译器可能会以不同的方式装饰 vtable。
猜你喜欢
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2014-03-20
相关资源
最近更新 更多