Вопрос или проблема
Проблема со сборкой ядра на Realme Note 50.
Кто-нибудь может помочь?
./include/linux/android_kabi.h:43:17: error: static assertion failed: "include/linux/sched.h:1312: struct{ u64 last_enqueue_ts; u64 last_sleep_ts; } is larger than "
43 | _Static_assert(sizeof(struct{_new;}) <= sizeof(struct{_orig;}),
| ^~~~~~~~~~~~~~
./include/linux/android_kabi.h:67:17: note: in expansion of macro ‘__ANDROID_KABI_CHECK_SIZE_ALIGN’
67 | __ANDROID_KABI_CHECK_SIZE_ALIGN(_orig, _new);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./include/linux/sched.h:1312:9: note: in expansion of macro ‘_ANDROID_KABI_REPLACE’
1312 | _ANDROID_KABI_REPLACE(ANDROID_VENDOR_DATA_ARRAY(1, 2), struct{ u64 last_enqueue_ts; u64 last_sleep_ts; });
| ^~~~~~~~~~~~~~~~~~~~~
./include/linux/android_kabi.h:48:17: error: static assertion failed: “include/linux/sched.h:1312: is not aligned the same as struct{ u64 last_enqueue_ts; u64 last_sleep_ts; }”
48 | _Static_assert(alignof(struct{_new;}) <= alignof(struct{_orig;}),
| ^~~~~~~~~~~~~~
./include/linux/android_kabi.h:67:17: note: in expansion of macro ‘__ANDROID_KABI_CHECK_SIZE_ALIGN’
67 | __ANDROID_KABI_CHECK_SIZE_ALIGN(_orig, _new);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./include/linux/sched.h:1312:9: note: in expansion of macro ‘_ANDROID_KABI_REPLACE’
1312 | _ANDROID_KABI_REPLACE(ANDROID_VENDOR_DATA_ARRAY(1, 2), struct{ u64 last_enqueue_ts; u64 last_sleep_ts; });
| ^~~~~~~~~~~~~~~~~~~~~
./include/linux/android_kabi.h:43:17: error: static assertion failed: "include/linux/sched.h:1314: struct{ unsigned long last_switch_count; unsigned long last_switch_time; unsigned long used_for_hung_task; } is larger than "
43 | _Static_assert(sizeof(struct{_new;}) <= sizeof(struct{_orig;}),
| ^~~~~~~~~~~~~~
./include/linux/android_kabi.h:67:17: note: in expansion of macro ‘__ANDROID_KABI_CHECK_SIZE_ALIGN’
67 | __ANDROID_KABI_CHECK_SIZE_ALIGN(_orig, _new);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./include/linux/sched.h:1314:9: note: in expansion of macro ‘_ANDROID_KABI_REPLACE’
1314 | _ANDROID_KABI_REPLACE(ANDROID_OEM_DATA_ARRAY(1, 3), struct{ unsigned long last_switch_count; unsigned long last_switch_time; unsigned long used_for_hung_task; });
| ^~~~~~~~~~~~~~~~~~~~~
./include/linux/android_kabi.h:48:17: error: static assertion failed: “include/linux/sched.h:1314: is not aligned the same as struct{ unsigned long last_switch_count; unsigned long last_switch_time; unsigned long used_for_hung_task; }”
48 | _Static_assert(alignof(struct{_new;}) <= alignof(struct{_orig;}),
| ^~~~~~~~~~~~~~
./include/linux/android_kabi.h:67:17: note: in expansion of macro ‘__ANDROID_KABI_CHECK_SIZE_ALIGN’
67 | __ANDROID_KABI_CHECK_SIZE_ALIGN(_orig, _new);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./include/linux/sched.h:1314:9: note: in expansion of macro ‘_ANDROID_KABI_REPLACE’
1314 | _ANDROID_KABI_REPLACE(ANDROID_OEM_DATA_ARRAY(1, 3), struct{ unsigned long last_switch_count; unsigned long last_switch_time; unsigned long used_for_hung_task; });
| ^~~~~~~~~~~~~~~~~~~~~
make[1]: *** [scripts/Makefile.build:104: arch/arm64/kernel/asm-offsets.s] error 1
make: *** [Makefile:1243: prepare0] error 2```
Ответ или решение
Ошибка при сборке ядра Linux 5.4 на устройстве Realme Note 50 указывает на проблему с совместимостью структур данных, используемых в Android-коде ядра. Анализируя предоставленный лог ошибок, можно выделить несколько моментов, которые требуют исправления.
Ошибка Компиляции: Статические Утверждения
Ошибка, которую вы наблюдаете, связана с макросом _ANDROID_KABI_REPLACE
, применяемым для обеспечения совместимости API/ABI (Application Binary Interface) Android-ядра. Эти макросы используются для проверки размера и выравнивания структур в различных частях кода ядра.
-
Статическая проверка размера:
./include/linux/android_kabi.h:43:17: error: static assertion failed: "..."
Это указывает на то, что новая структура, задаваемая
_new
, превышает размеры оригинальной структуры_orig
. Такое несоответствие может вызвать ошибки при взаимодействии разных компонентов системы. -
Проверка выравнивания:
./include/linux/android_kabi.h:48:17: error: static assertion failed: "..."
Данная ошибка сообщает, что выравнивания различных структур не совпадают. Это важно для оптимальной работы процессора и может привести к проблемам в производительности или даже к сбоям.
Возможные Причины и Решения:
-
Несоответствие версий Android ядра:
Возможно, вы используете источник, несовместимый с текущей версией кода ядра Android. Проверьте, чтобы исходные файлы соответствовали той версии ядра, для которой разработаны используемые патчи. -
Необходимость в изменении структур:
Проверьте размеры и выравнивание названных структур в исходниках. Если вы добавляли или изменяли поля, убедитесь, что новые структуры соответствуют оригинальным по размеру и выравниванию. -
Правки в исходном коде:
- Изучите, какие изменения вы внесли в
include/linux/sched.h
иinclude/linux/android_kabi.h
. - Убедитесь, что не нарушены существующие полиморфные интерфейсы.
- Возможно, нужно заменить
_ANDROID_KABI_REPLACE
на соответствующий аналог, если у вас специфические изменения в ядре Android.
- Изучите, какие изменения вы внесли в
Рекомендации:
- Синхронизация с репозиторием производителя: Проверьте, есть ли обновления от производителя устройства. Возможно, они уже исправили подобные проблемы в своих репозиториях.
- Откат изменений: При неудачных попытках исправления лучше всего откатить изменения к состоянию по умолчанию и проанализировать порядок действий поочередно.
- Обратитесь к сообществу разработчиков: Публикация данной информации на форумах разработчиков, связанных с Android-ядром, может помочь в получении советов от опытных специалистов.
Снижение барьера совместимости и приведение всех структур в соответствии с желаемыми размерами и выравниванием является ключом к успешной сборке ядра на вашем устройстве. Удачи в решении вашего вопроса!