【问题标题】:Use gcc plugins to modify the order of variable declarations使用 gcc 插件修改变量声明的顺序
【发布时间】:2015-06-11 21:13:16
【问题描述】:

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

class A {
  char c;
  int i;
}

必须转向:

class A {
      int i;
      char c;
}

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

有人知道我该怎么做吗? 谢谢!

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

【问题讨论】:

  • 能否将变量封装在一个类中?你会得到一个有保证的类初始化顺序。
  • 我想给变量我自己的顺序,也许我不是很清楚,我想写一个gcc插件:gcc.gnu.org/wiki/plugins如果你想了解更多关于gcc插件的信息。该插件将允许我更改变量的声明顺序。

标签: c++ gcc g++ gcc-plugins gimple


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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-17
      • 2016-12-15
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2017-08-06
      • 2017-04-06
      相关资源
      最近更新 更多