This is klibc, what is intended to be a minimalistic libc subset for
use with initramfs.  It is deliberately written for small size,
minimal entaglement, 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) In the source root directory (the directory above the one in which
   this file is found) create a symlink called "linux" pointing to a
   reasonably recent Linux kernel tree (2.4 or 2.6 should be OK.)
   This tree must have the include/asm symlink set up for the
   architecture you're compiling for, and include/linux/autoconf.h
   must exist.  The easiest way to make sure of all of these is to do
   a "make config" or any of its variants on the kernel tree is
   question, followed by a "make dep" (2.4) or "make prepare" (2.6).

b) If you're cross-compiling, change KLIBCARCH in the main MCONFIG file to
   the appropriate architecture, and set CROSS 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
   cris:	 Working
   h8300:	 Not yet ported
   i386:	 Working
   ia64:	 Working
   m32r:	 Untested
   m68k:	 Not yet ported
   mips:	 Working
   mips64:	 Not yet ported
   parisc:	 Working
   parisc64:	 Not yet ported
   ppc:		 Working
   ppc64:	 Working
   s390:	 Working static, shared untested
   s390x:	 Working
   sh:		 Untested
   sh64:	 Not yet ported
   sparc:	 Working
   sparc64:	 Untested
   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) Type "make" and pray...

d) 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
