Итоговый отчёт по сборке AC7020C EDF
Дата сборки: 2026-10-02
Результат: ✅ успешно (0 ошибок)
Целевые пакеты: xilinx-bootbin, edf-linux-disk-image
Содержание
- Среда сборки
- Результат
- Сводка решённых проблем и патчей
- Подробности по каждому патчу
- Первоисточники и обращения
- Вывод
1. Среда сборки
| Параметр | Значение |
|---|---|
| Хост-ОС | Ubuntu 26.04 (ядро Linux 7.0.0-34-generic) |
| glibc хоста | 2.43 (нативная сборка, не в chroot) |
| Компилятор | gcc 15.2 |
dd на хосте |
uutils coreutils 0.8.0 (Rust-реализация) |
| Воркспейс | /home/edf/projects/ac7020c |
| Релиз EDF | amd-edf-rel-v26.06.1 |
| Machine | ac7020c-sdt (Zynq-7020, xc7z020clg400-2) |
| Ядро | linux-xlnx 6.18.10 |
| U-Boot | 2026.01 |
| uninative | отключён (host glibc 2.43 > uninative 2.42) — нативные пакеты компилируются против host-glibc |
| Команда сборки | source edf-init-build-env build && MACHINE=ac7020c-sdt bitbake xilinx-bootbin edf-linux-disk-image |
Ключевое отличие от прошлой сборки: прошлая шла в chroot с glibc 2.39, эта — нативная на glibc 2.43. Именно glibc 2.43 / gcc 15.2 / uutils-coreutils и породили все описанные ниже проблемы.
2. Результат
Tasks Summary: Attempted 10749 tasks of which 10612 didn't need to be rerun and all succeeded.
Артефакты в build/tmp/deploy/images/ac7020c-sdt/:
| Артефакт | Файл | Размер |
|---|---|---|
| Загрузочный образ | BOOT-ac7020c-sdt-20261002101350.bin (boot.bin) |
5.3 MB |
| U-Boot скрипт | boot.scr |
1.1 KB |
| Rootfs (сжатая) | edf-linux-disk-image-ac7020c-sdt.rootfs.wic.xz |
79 MB |
| Rootfs (raw) | edf-linux-disk-image-ac7020c-sdt.rootfs.wic |
4.0 GB |
| FSBL | fsbl-ac7020c-sdt.elf |
458 KB |
| U-Boot | u-boot-ac7020c-sdt.bin |
1.1 MB |
| Ядро | uImage |
4.7 MB |
| Device tree | system.dtb, cortexa9-linux.dtb |
— |
3. Сводка решённых проблем и патчей
Все патчи находятся в кастомном слое meta-ac7020c/ (в директории
документации). Полные тексты и пояснения — в NATIVE-BUILD-FIXES.md.
| # | Пакет | Файлы фикса | Проблема | Автор |
|---|---|---|---|---|
| 1 | pseudo | recipes-devtools/pseudo/pseudo_%.bbappend |
glibc 2.43: openat2()/close_range() возвращают ENOSYS, strchr() const-mismatch, EFAULT → fakeroot-do_package падает |
Claude Code (пред. сессия, PetaLinux) |
| 2 | bootgen | recipes-devtools/bootgen/bootgen_%.bbappend |
gcc 15: -Wincompatible-pointer-types/-Wimplicit-function-declaration стали ошибками |
Claude Code (пред. сессия, PetaLinux) |
| 3 | dtc | recipes-kernel/dtc/dtc_%.bbappend |
gcc 15: -Wdiscarded-qualifiers стал ошибкой |
Claude Code (пред. сессия, PetaLinux) |
| 4 | elfutils | recipes-devtools/elfutils/elfutils_%.bbappend |
gcc 15: -Wdiscarded-qualifiers стал ошибкой |
Claude Code (пред. сессия, PetaLinux) |
| 5 | util-linux | recipes-core/util-linux/util-linux_%.bbappend + lsfd-bsearch.patch |
trailing comma в compound-literal для bsearch |
Claude Code (пред. сессия, PetaLinux) |
| 6 | u-boot-xlnx | recipes-bsp/u-boot/u-boot-xlnx_%.bbappend + spl-align-dd-cbs.patch |
uutils dd (как GNU coreutils ≥ 9.5) требует cbs=N при conv=block |
Claude Code (пред. сессия, PetaLinux) |
| 7 | mesa | recipes-graphics/mesa/mesa_%.bbappend + glibc243-c11-threads.patch |
glibc 2.43 объявил C11-потоки (once_flag/call_once) в <stdlib.h> → конфликт с yohhoy-бандлом mesa |
Claude Code (эта сессия) |
| 8 | virglrenderer | recipes-graphics/virglrenderer/virglrenderer_%.bbappend + glibc243-c11-threads.patch |
тот же конфликт yohhoy-бандла C11 с glibc 2.43 | Claude Code (эта сессия) |
4. Подробности по каждому патчу
4.1. Патчи #1–6 (перенесены из PetaLinux 2025.2)
Автор: Claude Code, предыдущая сессия (при подготовке PetaLinux 2025.2 к нативной сборке).
Первоисточник (документация): журнал миграции
/home/petalinux/petalinux_projects/ac7020c/PetaLinux_to_EDF_migration_guide.md,
§5.7 («Патчи gcc-15/glibc-2.43») и §11.9.
Откуда перенесено: PetaLinux 2025.2 meta-user
(/home/petalinux/petalinux_projects/ac7020c/project-spec/meta-user/).
Перенос в EDF выполнен 1:1 с незначительными адаптациями (FILESEXTRAPATHS
по конвенции слоя ${THISDIR}/${PN}:, bbappend pseudo сделан универсальным
pseudo_%.bbappend, у u-boot перенесён только spl-align-dd-cbs.patch).
Суть каждого фикса — в таблице §3 и в NATIVE-BUILD-FIXES.md.
4.2. Патч #7 — mesa (эта сессия)
Проблема. glibc 2.43 добавил объявления C11-потоков в <stdlib.h> в C-режиме
(под __GLIBC_USE(ISOC23); mesa компилируется с -D_GNU_SOURCE, который его
включает): once_flag (через <bits/types/once_flag.h>) и прототип call_once.
Mesa 24.0.7 бандлит эмуляцию C11 <threads.h> (yohhoy) в
src/c11/threads.h + src/c11/impl/threads_posix.c, где once_flag = pthread_once_t
и есть собственный call_once. Итог — ошибка компиляции:
c11/threads.h:121: conflicting types for 'once_flag'
c11/threads.h:151: conflicting types for 'call_once'
threads_posix.c:74: conflicting types for 'call_once'
История поиска решения (важно):
(системные C11-потоки) — ломаетwith_c11_threads = trueegl_dri2.c: в glibccnd_t/mtx_t— отдельные типы-обёртки, аegl_dri2.c:3450вызываетpthread_cond_init(&cond, …)напрямую наcnd_t→ несовпадение типов.гвард по версии glibc(пропустить бандл-once_flag/call_onceпри glibc ≥ 2.43) — ломает C++-TU: glibc объявляетonce_flag/call_onceтолько в C (#ifndef __cplusplus), поэтому в.cpp-файлах (lp_bld_misc.cppи др.) символы остаются необъявленными.
Финальное решение — переименование. Бандл-символы переименованы в
mesa_once_flag / mesa_call_once / MESA_ONCE_FLAG_INIT, а публичные имена
замаплены обратно макросами (+ #undef ONCE_FLAG_INIT от макроса glibc):
typedef pthread_once_t mesa_once_flag;
# define MESA_ONCE_FLAG_INIT PTHREAD_ONCE_INIT
void mesa_call_once(mesa_once_flag *, void (*)(void));
#undef ONCE_FLAG_INIT
#define once_flag mesa_once_flag
#define ONCE_FLAG_INIT MESA_ONCE_FLAG_INIT
#define call_once mesa_call_once
Это работает одинаково в C и C++, не трогает ~40 точек использования и не меняет
семантику (once_flag остаётся pthread_once_t, как и ожидает код mesa).
4.3. Патч #8 — virglrenderer (эта сессия)
Проблема. Тот же конфликт yohhoy-бандла C11 (src/mesa/compat/c11/threads_posix.h)
с glibc 2.43, но у virglrenderer 1.0.1 эмуляция header-only (всё static inline),
поэтому хватает простого гварда: once_flag/ONCE_FLAG_INIT/call_once не определять
при glibc ≥ 2.43, а брать из <stdlib.h>.
5. Первоисточники и обращения
Внешних (интернет/upstream) патчей не использовалось — все фиксы авторские (Claude Code), на основе анализа исходников и локальной документации.
Обращения (первоисточники), к которым обращались при работе:
PetaLinux_to_EDF_migration_guide.md— первоисточник-документация для фиксов #1–6 (§5.7 и §11.9); лежит у пользователяpetalinux.- glibc 2.43 заголовки (
/usr/include/) —stdlib.h,features.h,threads.h,bits/types/once_flag.h: для определения, под какими feature-макросами (__GLIBC_USE(ISOC23),_GNU_SOURCE) объявляютсяonce_flag/call_once, и что в C++-режиме они не объявляются. - Исходники mesa 24.0.7 —
meson.build,src/c11/threads.h,src/c11/impl/threads_posix.c,src/util/u_call_once.h,u_cpu_detect.h. - Исходники virglrenderer 1.0.1 —
src/mesa/compat/c11/threads_posix.h.
6. Вывод
Сборка AC7020C EDF v26.06.1 на нативном glibc 2.43 завершена успешно. Все 8 патчей
зафиксированы в слое meta-ac7020c и задокументированы в NATIVE-BUILD-FIXES.md;
при переносе воркспейса на другой хост с glibc 2.43 они подхватятся автоматически.
Особое внимание в будущем — пакеты, бандлящие yohhoy-эмуляцию C11 <threads.h>
(mesa, virglrenderer и потенциально другие): при обновлении glibc конфликт
once_flag/call_once может проявиться снова в новых версиях.