我已经设法让 BoehmGC 通过强制“侧栈”上的所有根来处理 webassembly。除了有很多终结器的情况外,这一切都很好。如果我没有终结器,这一切都可以工作,无论我分配了多少对象。一旦我设置了终结器,它就会失败,因为对象已损坏。终结器似乎在一个无效对象上被调用(0 处的值是无效的,或者它从一开始就没有被分配)。
现在我意识到这听起来有点模糊,但这对任何人来说都是一个警钟吗?
__GC_Finalizer
GC_notify_or_invoke_finalizers
GC_generic_malloc
GC_malloc
它总是在这个调用堆栈上失败。
__GC_Finalizer 被成功调用了无数次,并且只调用了一个 vmt 方法。伪代码如下:
(*(FnPtrWithThis**)obj))[8](obj)
它已经失败了,其中 obj 没有指向有效的 vmt(所有这些在数据段中都是常量,但它指向的 vmt 不是真正的 vmt 地址)。
如果有人有一些我可以查看的信息,比如关于终结器如何在内部工作的文档,或者我可以调试的地方,真的任何提示都会受到赞赏。