Итоговый отчёт по сборке AC7020C EDF

Дата сборки: 2026-10-02
Результат: ✅ успешно (0 ошибок)
Целевые пакеты: xilinx-bootbin, edf-linux-disk-image


Содержание

  1. Среда сборки
  2. Результат
  3. Сводка решённых проблем и патчей
  4. Подробности по каждому патчу
  5. Первоисточники и обращения
  6. Вывод

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'

История поиска решения (важно):

  1. with_c11_threads = true (системные C11-потоки) — ломает egl_dri2.c: в glibc cnd_t/mtx_t — отдельные типы-обёртки, а egl_dri2.c:3450 вызывает pthread_cond_init(&cond, …) напрямую на cnd_t → несовпадение типов.
  2. гвард по версии 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), на основе анализа исходников и локальной документации.

Обращения (первоисточники), к которым обращались при работе:

  1. PetaLinux_to_EDF_migration_guide.md — первоисточник-документация для фиксов #1–6 (§5.7 и §11.9); лежит у пользователя petalinux.
  2. 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++-режиме они не объявляются.
  3. Исходники 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.
  4. Исходники 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 может проявиться снова в новых версиях.