В ядре Linux есть gcc-плагин, который перетасовывает элементы некоторых структур во время перехвата события PLUGIN_FINISH_TYPE.
Он отлично работает на производимом двоичном файле (порядок элементов рандомизирован), но не влияет накарликовая отладочная информация.На самом деле, в то время как члены структуры хорошо перетасовываются в двоичном формате, отладочная информация этих структур остается в исходном порядке.
Как плагин может попросить gcc повторить отладочную информацию только что перемешанной структуры?
В основном,плагин работает так:
// put all fields of a struct in a tab newtree[]
// shuffle this array
// redo the tree chain
for (i = 0; i < num_fields - 1; i++)
TREE_CHAIN(newtree[i]) = newtree[i+1];
TREE_CHAIN(newtree[num_fields - 1]) = NULL_TREE;
// create a new FIELD_DECL
list = make_node(FIELD_DECL);
TREE_CHAIN(list) = newtree[0];
// and replace type fields of all variant of our struct (->type)
main_variant = TYPE_MAIN_VARIANT(type);
for (variant = main_variant; variant; variant = TYPE_NEXT_VARIANT(variant))
TYPE_FIELDS(variant) = list;
// finally, force a relayout of the main variant
TYPE_SIZE(main_variant) = NULL_TREE;
layout_type(main_variant);
// Call to rebuild the debug informations ?