That global state is the coordination problem it's solving. Who owns the thread list? The current process wide setreuid identity? The loaded library list? Debug info registrations? Shared dynamic memory allocations? TLS slots? Someone has to, and that someone is libc. Avoiding it because it has state is to be confused about the whole concept of an OS.
Yeah, it's mixed up with the same library that provides sscanf and strcat. So what? You don't have to call them.
Yeah, it's mixed up with the same library that provides sscanf and strcat. So what? You don't have to call them.