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