This is klibc, what is intended to be a minimalistic libc subset for
use with initramfs.  It is deliberately written for small size,
minimal entanglement, and portability, not speed.  It is definitely a
work in progress, and a lot of things are still missing.


The build procedure is not very polished yet, but it should work like
this:

a) Extract a recent Linux kernel into a directory and run
   "make headers_install".
   Now enter the klibc dir and point KLIBCKERNELSRC to the
   path of the configured linux tree
   "make  KLIBCKERNELSRC=`pwd`/../linux/usr/".


b) If you're cross-compiling, you need to set KLIBCARCH to the
   appropriate architecture, and set CROSS_COMPILE to your toolchain
   prefix.

   IMPORTANT: if you're on a 64-bit machine with a 32-bit userland
   (ia64, mips64, ppc64 sparc64, s390x or x86_64), and you want to
   build the 32-bit version: you need to set KLIBCARCH to the 32-bit
   architecture as well as set up the linux/include/asm symlink to
   point to the 32-bit architecture.  Building the 32-bit architecture
   usually (but not always) produces smaller binaries, and is likely
   to be better tested.

   If you are on ARM, and want to build a thumb version of the library
   (this is supported), change OPTFLAGS in arch/arm/MCONFIG to build
   thumb code.

   The following is the last known status of various architectures:

   alpha:	 Working
   arm-thumb:	 Untested
   arm:		 Working
   arm26:	 Not yet ported
   arm64:	 Working
   avr32:	 Not yet ported
   cris:	 Working
   h8300:	 Not yet ported
   i386:	 Working
   ia64:	 Working static, shared untested
   m32r:	 Untested
   m68k:	 Working
   mips:	 Working
   mips64:	 Not yet ported
   parisc:	 Untested
   parisc64:	 Not yet ported
   ppc:		 Working
   ppc64:	 Working
   s390:	 Working
   s390x:	 Working
   sh:		 Runtime breakage
   sh64:	 Not yet ported
   sparc:	 Working
   sparc64:	 Working
   v850:	 Not yet ported
   x86-64:	 Working
   xtensa:	 Not yet ported

   Shared library support requires recent binutils on many
   architectures.

   Note that even the "working" ones likely have bugs.  Please report
   them if you run into them.

c) Try the test programs in the tests/ directory.  They should run...

Contact the klibc mailing list:

	http://www.zytor.com/mailman/listinfo/klibc

... for more info.

	-hpa
