Picolibc 1.8.12 dostal vlastní vrstvu linuxových systémových volání
Vestavěná knihovna jazyka C, kterou udržuje Keith Packard, vyšla po půl roce ve verzi 1.8.12. Přibyl v ní adresář libos/linux se 110 zdrojovými soubory, které sahají na linuxové jádro přímo, bez jiné knihovny C pod sebou. V předchozí verzi 1.8.11 ten adresář v repozitáři vůbec nebyl.

Keith Packard zveřejnil 1. srpna Picolibc 1.8.12. Předchozí vydání 1.8.11 je z 27. ledna, takže mezi nimi uplynulo půl roku; srovnání obou značek na GitHubu vypisuje 426 commitů.
Picolibc je knihovna jazyka C pro vestavěné systémy s málo pamětí. Vznikla smícháním kódu z newlibu a AVR Libc a šíří se pod licencemi typu BSD. Vedle linuxové úlohy průběžné integrace má repozitář i úlohy pro Zephyr a coreboot a samostatný adresář se soubory pro Zephyr.
Nová vrstva volá jádro sama
Nejpodstatnější změna je adresář libos, který ve verzi 1.8.11 v repozitáři vůbec nebyl. Podpora poloviční hostitelské obsluhy, tedy semihostingu, se do něj přestěhovala z nejvyšší úrovně a vedle ní přibyly tři sourozenci: fallback, dummyhost a hlavně linux.
Ten poslední obsahuje 110 zdrojových souborů v jazyce C. Většina z nich je jedna funkce POSIX: open, poll, sigaction, mmap, waitpid, obsluha terminálu přes tcgetattr a tcsetattr. Nejsou to obálky nad cizí knihovnou C. Zbytek souborů jsou převodní pomůcky mezi tvarem, který drží jádro, a tím, se kterým pracuje knihovna. Vstup do jádra řeší assemblerový soubor syscall.S v adresáři podle architektury; vlastní ho aarch64, arm a x86. Hlavičky s čísly volání, chybovými kódy a rozložením struktur jsou tamtéž pro pět architektur, k předchozím třem navíc pro i686 a x86_64.
Poznámky k vydání to shrnují stručně: nativní podpora Linuxu na několika architekturách dovolí sestavit řadu linuxových aplikací a testovacích případů. Ta druhá polovina není vedlejší. Picolibc se dosud testovalo hlavně na holém železe pod emulátorem QEMU, takže možnost pustit sadu testů rovnou na hostiteli zkracuje smyčku vývoje.
Zajímavý je způsob, jak se knihovna vyrovnává s rozdílnými datovými strukturami. Dřív se některé struktury Picolibc snažily napodobit rozložení, které používá Linux. Nové vydání to opouští a obsah převádí až za běhu. V adresáři je i podadresář utils s generátory make-syscall.c, make-errno.c a struct-analyze.c, ke kterým patří popisy struktur v souborech JSON.
Kolik architektur to vlastně je
Server Phoronix, který o vydání psal 1. srpna, napsal, že Picolibc rozšiřuje nativní podporu Linuxu na další procesorové architektury, a připojil výčet: ARC, ARM, i386, LatticeMico32, LoongArch, m68k, MIPS, MSP430, Nios II, OpenRisc, Power9, Renesas RX, RISC-V, SparcV8, SuperH, x86_64 a Xtensa ESP32.
Ten seznam ale v souboru README stojí pod nadpisem Supported Architectures a úvodní věta pod ním mluví o architekturách, pro které má knihovna zabudované testování. Na nativní linuxovou vrstvu se ten výčet nevztahuje. Nativní port má v repozitáři pět architektur hlaviček a tři se vstupním kódem do jádra, jak je vidět výš. Poznámky k vydání ostatně mluví o několika architekturách, ne o všech. Rozdíl je podstatný pro každého, kdo si podle výčtu vybírá cíl.
Typ off64_t zmizel
Z hlavičkových souborů zmizel typ off64_t. Nová verze má jen off_t a ten je vždy 64bitový. Jinde je to dvojice: 32bitový off_t na velké soubory nestačil, takže k němu přibyl širší typ a s ním druhá sada funkcí s příponou 64. Vestavěná knihovna psaná od nuly tenhle dluh nést nemusí, takže si Picolibc zvolilo jeden typ. Kdo měl off64_t v kódu, musí ho přepsat.
RISC-V kopíruje paměť vektorově
Funkce memset, memcpy a memmove dostaly pro RISC-V vektorové provedení, které přispěl Pincheng Wang. Abdallah Abdelhafeez k tomu doplnil 32bitové vektorové varianty a přeuspořádáním instrukcí zrychlil strcmp. Týž přispěvatel opravil v obecné céčkové verzi memcpy pro RISC-V smyčku, která kopírovala devět prvků místo osmi.
Přibyla i podpora rozšíření Zcmt (Sam Elliott) a varianta spouštěcího kódu, která zapíná ochranu toku řízení přes zicfilp a zicfiss (Ahmed Shehab). Na architektuře AArch64 inicializuje spouštěcí kód picocrt jednotku SME.
Zamykání se pročistilo
Vnitřní zámek knihovny se přestal zamykat rekurzivně a Kushal Pal opravil souběh při líné inicializaci vyrovnávaného vstupu a výstupu. Brian Cain doplnil k funkcím, které mění stav zámku, anotace pro rozbor bezpečnosti vláken v překladači Clang. Dokumentace ke knihovně popisuje jediný globální zámek pro sdílená data (malloc, atexit, arc4random, getenv, časová pásma a staré globální proměnné stdio) a zámky na jednotlivé soubory pro vyrovnávaný vstup a výstup.
Z drobnějších změn: obsluha semihostingu na ARM nově zachovává registr LR a umí použít instrukci hlt místo svc; pro architekturu verze 8 a vyšší je to doporučený postup. Přibyly funkce pro práci se souborem skupin podle POSIX, fopencookie a open_memstream od Alexeye Lapshina a dvojice quick_exit a at_quick_exit. Architektura Hexagon dostala semihosting, prostředí pro práci s plovoucí čárkou, dynamické linkování i optimalizované matematické funkce.
Podle nás je nativní linuxová vrstva zajímavější jako nástroj pro vývojáře knihovny než jako nabídka koncovým programům. Kdo píše běžnou aplikaci pro Linux, glibc ani musl neopustí; kdo ladí Picolibc, ušetří kolo přes emulátor.