nolibc seems kinda neglected, or like a minimal subset of what's actually useful. There's no pread/pwrite etc, only read/write, forcing you to use lseek and ruining concurrent use.
Wasn’t that originally just for integration tests where you wanted to boot a minimal image that just runs your kernel CI test?
It doesn't strive to be a complete implementation.
If users send patches support for them, new syscalls can be added. Or downstream users can keep those definitions in their own program. More complex features like threads are out of scope.
(Disclaimer: I'm one of the maintainers)