我知道这很难做到,我应该避免,但我有自己的理由。我想在编译时修改一些字段声明的顺序,例如:
class A {
char c;
int i;
}
必须转到:
class A {
int i;
char c;
}
如果我选择交换CCD_ 1和CCD_,我想知道如何更改具有tree
的字段声明的location
有人知道我该怎么做吗??谢谢
我使用插件的g++4.9.2版本
如果我要尝试这种方法,我会尝试两种不同的方法。
-
挂接到
PLUGIN_FINISH_TYPE
事件并在那里重写类型。要重写它,请对字段重新排序,并强制重新发布类型。您必须阅读一些GCC源代码,才能了解如何使布局无效并强制使用新布局。 -
如果这不起作用,请添加一个在giplification之后运行的新过程,并尝试重写那里的类型。不过,我怀疑这不太可能奏效。
- 钩住PLUGIN_FINISH_TYPE事件并在那里重写类型。要重写它,请对字段重新排序,并强制重新发布类型。您必须阅读一些GCC源代码,才能了解如何使布局无效并强制使用新布局
这是在linux内核的randomize_layout_plugin.c中实现的。
此解决方案有效,但它分解了侏儒调试信息。实际上,在调试信息中,成员的顺序与源代码中最初定义的顺序相同,但结构在二进制文件中被很好地打乱了。