The uClibc stubs for pread() and pwrite() for powerpc (and possibly other architectures) are attempted to be implemented using multiple lseek calls. This is broken for just so many reasons. Even for non-threaded programs the cost of the extra system calls is significant. A proper system call stub can easily be generated by copying the mmap code. AFAICT this affects all versions of uClibc, we are still using 0.9.27. I believe we can't update because of a binary incompatibility in a slightly later version.
the fallback hacks should not be used. we should be hitting the kernel syscalls directly whenever possible. this is merely a case of the kernel renamed their syscall names and uClibc missed the update. i don't know what you mean by referring to mmap
http://git.uclibc.org/uClibc/commit/?id=52fa45da0f86651b70608a58914f3aece7fdfed5
I couldn't find the definition of __syscall_pread() or __syscall_pwrite(), but I didn't try to build it to see what happens. There is an mmap.c in the 0.9.27 sources ...