2

我知道这很难做到,我应该避免这样做,但我有我的理由。我想在编译时修改一些字段声明的顺序,例如:

class A {
  char c;
  int i;
}

必须转向:

class A {
      int i;
      char c;
}

如果我选择交换 and 的顺序ic我想知道如何更改location具有它的字段声明的tree

任何人都知道我该怎么做?谢谢 !

我使用g++ 4.9.2版本的插件

4

2 回答 2

3

如果我要尝试这个,我会尝试两种不同的方法。

  1. 挂钩到PLUGIN_FINISH_TYPE事件并在那里重写类型。要重写它,请重新排序字段并强制重新布局类型。您必须阅读一些 GCC 源代码才能了解如何使布局无效并强制使用新布局。

  2. 如果这不起作用,请添加一个在 gimplification 之后运行的新通道,并尝试在那里重写类型。不过,我怀疑这不太可能奏效。

于 2015-04-22T18:12:13.033 回答
0
  1. 连接到 PLUGIN_FINISH_TYPE 事件并在那里重写类型。要重写它,请重新排序字段并强制重新布局类型。您必须阅读一些 GCC 源代码才能了解如何使布局无效并强制使用新布局。

这是在 linux 内核的randomize_layout_plugin.c中实现的。

此解决方案有效,但它破坏了矮小的调试信息。实际上,在调试信息中,成员的顺序与源代码中最初定义的顺序保持一致,但结构在二进制文件中被很好地打乱了。

于 2019-06-20T14:24:41.993 回答