我可以用 g++ 获取虚拟方法表的大小吗?



我正在开发一个带有插件系统的程序,该系统由从抽象类派生的插件工作。该程序是用 c++ 编写的,并使用 g++ 构建。

显然,当将新功能添加到抽象类中时,它将使插件接口与以前的版本不兼容。我想自动检测这一点并将插件标记为不兼容。

为此,我想获取抽象类的虚拟方法表的大小。对于使用 g++ 编译的程序,有没有办法做到这一点(我知道仅使用标准 c++ 功能是不可能的(。

我更喜欢在程序中工作的解决方案,但是涉及使用外部工具查看目标文件的方法也是可以接受的。

我最终做了什么(在某种程度上受到评论的指导(。这比简单的虚拟方法表的大小更进一步。

首先,我使用 sed 将 "= 0" 替换为 "{}",这样做的原因是转储的类层次结构比纯虚拟方法具有更多的真实方法信息。然后我使用-fdump-class-hierarchy选项将其输出通过管道连接到 g++ 中。

sed 's/= 0/{}/' <my header> | g++ -c -fdump-class-hierarchy <search path arguments> -x c++ -o dummy.o -"

这创建了一个名为"-.002t.class"的文件(我知道中间部分因 g++ 版本而异(,其中包含所有 VMT 的详细信息以及类的大小和对齐方式(但遗憾的是不是其字段的完整详细信息(

然后我使用 python 挑选出我感兴趣的类的部分,编辑掉大的十六进制数字(我不确定所述数字的含义,但它们似乎与类的结构无关,我猜它们是目标文件中的地址或其他东西(并将它们(以及其他一些数据(提供给哈希函数以生成"插件兼容性 ID"。

相关内容

最新更新