Я предполагаю, основываясь на ваших комментариях, что вы хотите изменить свой код, а не все ядро 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;
};
Чтобы проверить свою структуру, вы можете использовать assert во время компиляции, что-то вроде этого:
#define CASSERT(cond, name) typedef cassert__##name[cond ? 1 : -1]
CASSERT(offsetof(foo, field1) == 0, field1_wrong);
CASSERT(offsetof(foo, field2) == 4, field2_wrong);
Если ваши утверждения неверны, сборка завершится неудачно с полезной ошибкой и номером строки