gpt4 book ai didi

c++ - DLL : request for clarification regarding headers and vtable construction 导出的类的 vtable 布局不正确

转载 作者:行者123 更新时间:2023-11-28 01:10:45 27 4
gpt4 key购买 nike

虽然手头的问题已解决,但让我有点困惑的是什么数据用于构造类的虚表以及虚表的布局存储在哪里。如果有人可以提供澄清或指出一些可能满足我好奇心的信息,我将不胜感激。

背景

  1. 两个独立的 VC6.0 项目:一个用于 exe,一个用于 dll。
  2. 应用程序包含来自 dll 项目发布的 .lib、.dll 和 .h 文件。
  3. 当新版本准备就绪时,.lib、.dll 和 .h 文件会从 dll 项目复制到 exe 项目中。
  4. 我继承了这个方案。

问题:

我最近对 ​​DLL 进行了更改并复制了 .lib 和 .dll,但忘记复制头文件。发生了一些层次结构变化,因此,一个特定类(称为 InternalClass)的 vtable 发生了变化。

exe 不会直接调用 InternalClass 上的任何方法。相反,它创建了一个不同类的实例(称之为 InterfaceClass),它封装了一个指向 InternalClass 对象的指针,并针对该指针调用各种方法。

在运行时,从 InterfaceClass 方法内部调用 InternalClass 方法实际上调用了错误的方法(即 InterfaceClass 将调用 InternalClass::AInternalClass::B 将实际运行)。查看 asm,事实证明修复或 thunk(如果这是错误的行话,我很抱歉!)在 vtable 中使用了正确的 offset但是,vtable 本身包含您期望来自 头文件的指针列表。

实际问题:

我意识到我的错误,将头文件复制过来,重新编译,一切正常。 但是,我还有一个烦人的问题:

什么时候确定 vtables 的布局以及在运行时使用什么信息来构造这些类的 vtable?也就是说,在我看来,正确的 vtable 必须在编译 dll 时进行组装,以便偏移量等可用于从 InterfaceClass内部类。那么,为什么要在运行时使用过时的虚表呢?当 exe 使用其具有的 header 编译时,布局单独确定吗?

我不确定这是否完全清楚。如果我的问题过于复杂,请告诉我。谢谢!

最佳答案

嗯,一个有 12 年历史的编译器的繁重实现细节。当您在类上使用 __declspec(dllexport) 时,链接器会导出该类的成员。不是虚表。当编译器解析头文件中的类声明时,它会在类的客户端中重建。链接器用导出的成员地址填充该本地 vtable。

如果编译器直接从 DLL 中导出 vtable 会不会更好?也许吧,但是导出这样的实现细节非常脆弱。我想,害怕因为向后兼容性而将自己逼入无法摆脱的角落是一个强大的动力。

关于c++ - DLL : request for clarification regarding headers and vtable construction 导出的类的 vtable 布局不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3453402/

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