あなたのコメントに基づいて、Linuxカーネル全体(など)ではなく、変更したいコードであると想定しています。
関数の属性などについてはわかりませんが、特にパックされた属性については、これまで問題なく次のことを行いました。
基本的に、パックするコンパイラに依存する代わりに、コンパイル時のアサートと組み合わせた手動の埋め込みフィールドを使用できます。
struct foo {
u32 field1;
u16 field2;
u16 pad; // manual padding
// continue for other fields that the compiler would automatically pad for you with attribute packed
u32 field3;
};
構造を確認するには、次のようなコンパイル時のアサートを使用できます。
#define CASSERT(cond, name) typedef cassert__##name[cond ? 1 : -1]
CASSERT(offsetof(foo, field1) == 0, field1_wrong);
CASSERT(offsetof(foo, field2) == 4, field2_wrong);
アサーションが間違っている場合、ビルドは失敗し、役立つエラーと行番号が表示されます