我可以用 g++ 获得虚拟方法 table 的大小吗
Can I get the size of virtual method table with g++
我正在开发一个带有插件系统的程序,该系统通过从抽象 class 派生的插件工作。该程序是用c++编写的,用g++构建的。
很明显,当新功能被添加到抽象中时class,它会使插件接口与以前的版本不兼容。我想自动检测这个并将插件标记为不兼容。
为此,我想获取抽象 class 的虚拟方法 table 的大小。对于用 g++ 编译的程序,有什么方法可以做到这一点(我知道仅使用标准的 c++ 功能是不可能的)。
我更喜欢在程序内工作的解决方案,但涉及使用外部工具查看目标文件的方法也可以接受table。
我最终做了什么(在评论的指导下)。这比虚拟方法的大小更进一步 table.
首先,我使用 sed 将“= 0”替换为“{}”,这样做的原因是转储的 class 层次结构包含的真实方法信息多于纯虚拟方法信息。然后我使用 -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 的详细信息以及 classes 的大小和对齐方式(但遗憾的是没有他们领域的全部细节)
然后我用python选出我感兴趣的class部分,编辑掉大的十六进制数字(我不确定所说数字的含义,但它们似乎与 classes 的结构无关,我猜它们是目标文件中的地址或其他东西)并将它们(连同一些其他数据)提供给哈希函数以生成“插件兼容性 ID”。
我正在开发一个带有插件系统的程序,该系统通过从抽象 class 派生的插件工作。该程序是用c++编写的,用g++构建的。
很明显,当新功能被添加到抽象中时class,它会使插件接口与以前的版本不兼容。我想自动检测这个并将插件标记为不兼容。
为此,我想获取抽象 class 的虚拟方法 table 的大小。对于用 g++ 编译的程序,有什么方法可以做到这一点(我知道仅使用标准的 c++ 功能是不可能的)。
我更喜欢在程序内工作的解决方案,但涉及使用外部工具查看目标文件的方法也可以接受table。
我最终做了什么(在评论的指导下)。这比虚拟方法的大小更进一步 table.
首先,我使用 sed 将“= 0”替换为“{}”,这样做的原因是转储的 class 层次结构包含的真实方法信息多于纯虚拟方法信息。然后我使用 -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 的详细信息以及 classes 的大小和对齐方式(但遗憾的是没有他们领域的全部细节)
然后我用python选出我感兴趣的class部分,编辑掉大的十六进制数字(我不确定所说数字的含义,但它们似乎与 classes 的结构无关,我猜它们是目标文件中的地址或其他东西)并将它们(连同一些其他数据)提供给哈希函数以生成“插件兼容性 ID”。