问题标签 [thunk]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 使用 v-table thunk 链接过程调用
我在网上阅读了一些关于 Vtable thunk 的文章,我在某处读到了 thunk 可用于挂钩 /chain 过程调用。
它可以实现吗?
有谁知道它是如何工作的,我也找不到解释 thunk 的好资源。对此有什么建议吗?
macos - Mac gcc 非虚拟 thunk 错误
我只在我的应用程序的部署版本中收到这些非虚拟 thunk 错误。它使用一个名为 Lgi 的私有框架。使用 XCode 3.1.4 在 10.5.8 上构建(leopard 的最新版本?)错误如下所示:
无论如何,我知道我不会留下那些未定义的,因为它实际上确实在开发构建中链接并运行良好。现在,在谷歌搜索问题之后,首先要尝试的是更改优化设置,我这样做了......而且没有骰子。一些链接错误。
所以这些虚函数最初是在GDragDropTarget中定义的,GWindow的继承看起来是这样的:
(LgiClass 用于 win32 上的 __declspec 导出/导入)
关于下一步尝试什么的任何想法?
顺便说一句,这是框架的一些示例标志:
这是应用程序的编译/链接标志:
我不确定什么是相关的,所以我把它们都发布了。
c++ - 什么是“重击”?
我已经看到它在编程中使用(特别是在 C++ 域中)并且不知道它是什么。大概这是一种设计模式,但我可能是错的。谁能举一个thunk的好例子?
c++ - Thunk 和 ATL Thunk?
有人可以向我解释一下 Thunk 是什么吗?
和一个 ATL Thunk?
我知道 thunk 与 vtbl 和执行代码以找到正确的函数指针有关。我对吗?
dll - 导入地址表中的 Thunk 表?
什么是与 EXE 文件中用于导入外部 DLL 中使用的函数的导入地址表相关的 thunk 表?
这个 thunk 表只是一个包含“Thunk”到其他函数的表吗?
c++ - DLL 导出的类的 vtable 布局不正确:请求澄清有关标头和 vtable 构造的信息
尽管手头的问题已经解决,但对于使用什么数据来构造类的 vtable 以及 vtable 的布局存储在哪里,我还是有点困惑。如果有人可以提供澄清或指出一些可能满足我好奇心的信息,我将不胜感激。
背景
- 两个独立的 VC6.0 项目:一个用于 exe,一个用于 dll。
- 应用程序包含来自 dll 项目版本的 .lib、.dll 和 .h 文件。
- 当新版本准备就绪时,.lib、.dll 和 .h 文件将从 dll 项目复制到 exe 项目中。
- 我继承了这个方案。
问题:
我最近对 DLL 进行了更改并复制了 .lib 和 .dll 但忘记复制头文件。层次结构发生了一些变化,因此,一个特定类(称为它InternalClass
)的 vtable 发生了变化。
exe 不会直接调用InternalClass
. 相反,它创建了一个不同类的实例(称为它InterfaceClass
),它封装了一个指向InternalClass
对象的指针并针对该指针调用各种方法。
在运行时,从InterfaceClass
方法内部对InternalClass
方法的调用实际上是在调用错误的方法(即InterfaceClass
会调用InternalClass::A
并InternalClass::B
实际运行)。查看asm,事实证明 fixup 或 thunk(如果这是错误的行话,我很抱歉!)正在使用正确的偏移量到 vtable 中。但是,vtable 本身包含您希望从旧头文件中获得的指针列表。
实际问题:
我意识到我的错误,将头文件复制过来,重新编译,一切都很好。然而,我留下了一个挥之不去的问题:
何时确定 vtable 的布局以及在运行时使用哪些信息为这些类构建 vtable?也就是说,在我看来,在编译 dll 时必须已经组装了正确的vtable,以便偏移量等可以用于从InterfaceClass
to的调用InternalClass
。那么,为什么在运行时使用过时的 vtable 呢?使用它拥有的头文件编译exe时,布局是否也单独确定?
我不确定这是否完全清楚。让我知道我的要求是否过于复杂。谢谢!
c - 为什么输出是“In foo, a = 7”?
任何人都知道上面的代码在哪里6
增加了1
?
c++ - MSVS2010 链接器错误悲伤 - 不完全确定出了什么问题
我正在使用教程中的代码库来提供将非静态成员函数的函数点传递给需要静态函数指针的函数的功能,这可能有助于了解我在起诉什么,所以这里是链接http:/ /www.codeproject.com/KB/cpp/thunk32.aspx此代码使用 Boost 库,我已经下载并设置了或多或少的所有内容。
在 Thunk 库中,其中一个头文件有一段读取
但这给了我大量的错误,我可以通过将其更改为来解决
下载的这段代码作为第二个项目包含在我的解决方案中,它能够愉快地编译和构建。但是我使用此代码的项目存在链接问题,为了避免人们询问,我收到这些错误消息
我认为这是想说构造函数和析构函数没有声明,而且我的 WebCamera.Init() 也搞砸了。我已确保 Thunk32 项目导出的库包含在我的其他项目中,但我仍然收到这些错误。
我想知道我是否做出了??=include
应该更改为的正确假设,#include
如果有,我做错了什么或没有做错什么会导致这些链接器错误。或者,如果您可以为我提供一种能够将函数指针传递给非静态成员函数的不同方式,那就太棒了。
谢谢
atl - 关于 ATL Windowing Thunking 中 esp 寄存器使用的问题
众所周知,ATL 通过 thunking 将一个窗口挂接到它的 wndproc,它实际上用 this 指针替换 hwnd 并跳转到 wndproc,因此对 wndproc(hwnd, ...) 的调用实际上是 wndproc(this, .. .) .
下面是 thunk 构造的汇编代码:
我的问题是,由于这个 thunk 只执行一次,我们如何确保 [esp+0x4] 不会被 CPU 覆盖以调用另一个过程,并且下次调用 wndproc(...) 时,再次传入 hwnd ? 我的理解是 [esp+0x4] 是一个可重用的通用寄存器,用于存储任何过程的第一个参数。
这里有什么问题?如何保证 hwnd 的修改是永久的?
谢谢。
c++ - “缺少非虚拟 thunk”和继承顺序
我们在 C++ 中有一个庞大的代码库,在进行了一次小的重构(添加了一个类并重写了一些相关方法)之后,我们开始在 GCC 3 和 4 上遇到链接器错误。链接器错误特别是“缺少对非虚拟 thunk 的引用”在我们的大型 SDK 中子类化类的小示例程序。
除了一些似乎已解决的旧 GCC 错误之外,搜索网络并没有给出很多提示。
问题的属性似乎是:
- GCC 3.4.6 & 4.3.3 优化
-O2
- 多重继承,包括偶尔的虚拟继承。
class Foo: public A, public B {}
例如,将继承顺序从
class Foo: public B, public A {}
缺少 thunk 的类更改为“修复”问题。
虚拟继承仅出现在单个、非常常用的用于引用计数的基类中。我已经验证了这个类的每次使用都是虚拟公共的,而不仅仅是偶然的公共继承。
显然摆弄继承顺序并不能真正解决问题。还能是什么?