Используйте плагины gcc для изменения порядка объявления переменных

Я знаю, что это очень трудно сделать, и что мне следует этого избегать, но у меня есть свои причины для этого. Я хочу изменить порядок некоторых объявлений полей во время компиляции, например:

class A {
  char c;
  int i;
}

должен обратиться к:

class A {
      int i;
      char c;
}

если я решил поменять порядок i а также cЯ хочу знать, как изменить location объявления поля, имеющего tree

Кто-нибудь знает, как я могу это сделать? Спасибо!

Я использую версию плагинов g++ 4.9.2

1 ответ

Если бы я собирался попробовать это, я бы попробовал два разных подхода.

  1. Зацепиться за PLUGIN_FINISH_TYPE событие и переписать тип там. Чтобы переписать его, измените порядок полей и принудительно введите тип реле. Вам нужно будет немного прочитать исходный код GCC, чтобы понять, как сделать макет недействительным и создать новый.

  2. Если это не сработало, добавьте новый проход, который выполняется сразу после упрощения, и попробуйте переписать там типы. Я подозреваю, что это вряд ли сработает, хотя.

  1. Подключитесь к событию PLUGIN_FINISH_TYPE и перепишите там тип. Чтобы переписать его, измените порядок полей и принудительно выполните ретрансляцию типа. Вам нужно будет немного прочитать исходный код GCC, чтобы понять, как сделать макет недействительным и принудительно создать новый.

Это реализовано в randomize_layout_plugin.c в ядре Linux.

Это решение работает, но не позволяет получить отладочную информацию. Фактически, в отладочной информации порядок членов остается таким же, как изначально определен в исходном коде, но структура хорошо перемешана в двоичном коде.

Другие вопросы по тегам