summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdk-stage1/dietlibc/.cvsignore16
-rw-r--r--mdk-stage1/dietlibc/AUTHOR2
-rw-r--r--mdk-stage1/dietlibc/BUGS8
-rw-r--r--mdk-stage1/dietlibc/CAVEAT5
-rw-r--r--mdk-stage1/dietlibc/CHANGES887
-rw-r--r--mdk-stage1/dietlibc/COPYING340
-rw-r--r--mdk-stage1/dietlibc/FAQ209
-rw-r--r--mdk-stage1/dietlibc/Makefile351
-rw-r--r--mdk-stage1/dietlibc/PORTING28
-rw-r--r--mdk-stage1/dietlibc/README14
-rw-r--r--mdk-stage1/dietlibc/SECURITY13
-rw-r--r--mdk-stage1/dietlibc/THANKS31
-rw-r--r--mdk-stage1/dietlibc/TODO26
-rw-r--r--mdk-stage1/dietlibc/alpha/Makefile.add2
-rw-r--r--mdk-stage1/dietlibc/alpha/__alarm.c13
-rw-r--r--mdk-stage1/dietlibc/alpha/__longjmp.S9
-rw-r--r--mdk-stage1/dietlibc/alpha/__testandset.S11
-rw-r--r--mdk-stage1/dietlibc/alpha/clone.S2
-rw-r--r--mdk-stage1/dietlibc/alpha/lseek64.S5
-rw-r--r--mdk-stage1/dietlibc/alpha/n_sigprocmask.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/setjmp.S31
-rw-r--r--mdk-stage1/dietlibc/alpha/sigaction.c7
-rw-r--r--mdk-stage1/dietlibc/alpha/signal.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/sigprocmask.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/socketpair.S3
-rw-r--r--mdk-stage1/dietlibc/alpha/start.S20
-rw-r--r--mdk-stage1/dietlibc/alpha/syscalls.h371
-rw-r--r--mdk-stage1/dietlibc/alpha/unified.S12
-rw-r--r--mdk-stage1/dietlibc/binshstr.h6
-rw-r--r--mdk-stage1/dietlibc/diet.131
-rw-r--r--mdk-stage1/dietlibc/diet.c313
-rw-r--r--mdk-stage1/dietlibc/dietdirent.h4
-rw-r--r--mdk-stage1/dietlibc/dietdns.h4
-rw-r--r--mdk-stage1/dietlibc/dietfeatures.h92
-rw-r--r--mdk-stage1/dietlibc/dieticonv.h12
-rw-r--r--mdk-stage1/dietlibc/dietlibm.h5
-rw-r--r--mdk-stage1/dietlibc/dietstdarg.h12
-rw-r--r--mdk-stage1/dietlibc/dietstdio.h83
-rw-r--r--mdk-stage1/dietlibc/dietuglyweaks.h24
-rw-r--r--mdk-stage1/dietlibc/dirstream.h78
-rw-r--r--mdk-stage1/dietlibc/dyn_start.c40
-rw-r--r--mdk-stage1/dietlibc/dyn_stop.c23
-rwxr-xr-xmdk-stage1/dietlibc/findcflags.sh8
-rw-r--r--mdk-stage1/dietlibc/i386/Makefile.add7
-rw-r--r--mdk-stage1/dietlibc/i386/PIC.h82
-rw-r--r--mdk-stage1/dietlibc/i386/__half.S10
-rw-r--r--mdk-stage1/dietlibc/i386/__longjmp.S1
-rw-r--r--mdk-stage1/dietlibc/i386/__ten.S9
-rw-r--r--mdk-stage1/dietlibc/i386/__testandset.S1
-rw-r--r--mdk-stage1/dietlibc/i386/accept.S4
-rw-r--r--mdk-stage1/dietlibc/i386/acos.S30
-rw-r--r--mdk-stage1/dietlibc/i386/acosh.S18
-rw-r--r--mdk-stage1/dietlibc/i386/asin.S29
-rw-r--r--mdk-stage1/dietlibc/i386/asinh.S18
-rw-r--r--mdk-stage1/dietlibc/i386/atan.S27
-rw-r--r--mdk-stage1/dietlibc/i386/atan2.S12
-rw-r--r--mdk-stage1/dietlibc/i386/atanh.S19
-rw-r--r--mdk-stage1/dietlibc/i386/atol.S55
-rw-r--r--mdk-stage1/dietlibc/i386/atoll.S64
-rw-r--r--mdk-stage1/dietlibc/i386/bind.S4
-rw-r--r--mdk-stage1/dietlibc/i386/cbrt.S46
-rw-r--r--mdk-stage1/dietlibc/i386/ceil.S44
-rw-r--r--mdk-stage1/dietlibc/i386/clone.S29
-rw-r--r--mdk-stage1/dietlibc/i386/connect.S4
-rw-r--r--mdk-stage1/dietlibc/i386/copysign.S18
-rw-r--r--mdk-stage1/dietlibc/i386/cos.S24
-rw-r--r--mdk-stage1/dietlibc/i386/cosh.S29
-rw-r--r--mdk-stage1/dietlibc/i386/dyn_syscalls.S283
-rw-r--r--mdk-stage1/dietlibc/i386/exp.S35
-rw-r--r--mdk-stage1/dietlibc/i386/exp10.S27
-rw-r--r--mdk-stage1/dietlibc/i386/exp2.S18
-rw-r--r--mdk-stage1/dietlibc/i386/expm1.S23
-rw-r--r--mdk-stage1/dietlibc/i386/fabs.S11
-rw-r--r--mdk-stage1/dietlibc/i386/floor.S26
-rw-r--r--mdk-stage1/dietlibc/i386/fmod.S37
-rw-r--r--mdk-stage1/dietlibc/i386/getenv.S48
-rw-r--r--mdk-stage1/dietlibc/i386/getpeername.S4
-rw-r--r--mdk-stage1/dietlibc/i386/getsockname.S4
-rw-r--r--mdk-stage1/dietlibc/i386/getsockopt.S4
-rw-r--r--mdk-stage1/dietlibc/i386/htonl.S13
-rw-r--r--mdk-stage1/dietlibc/i386/htons.S11
-rw-r--r--mdk-stage1/dietlibc/linuxnet.h19
-rw-r--r--mdk-stage1/dietlibc/parselib.h23
-rw-r--r--mdk-stage1/dietlibc/start.h14
-rw-r--r--mdk-stage1/dietlibc/syscalls.h151
-rwxr-xr-xmdk-stage1/dietlibc/threadsafe.sh5
86 files changed, 4073 insertions, 427 deletions
diff --git a/mdk-stage1/dietlibc/.cvsignore b/mdk-stage1/dietlibc/.cvsignore
index 7c88cb004..f0be42e21 100644
--- a/mdk-stage1/dietlibc/.cvsignore
+++ b/mdk-stage1/dietlibc/.cvsignore
@@ -10,3 +10,19 @@ bin-i386
bin-mips
bin-ppc
bin-sparc
+bin-mipsel
+bin-parisc
+bin-s390
+bin-sparc64
+pic-alpha
+pic-arm
+pic-i386
+pic-mips
+pic-ppc
+pic-sparc
+pic-mipsel
+pic-parisc
+pic-s390
+pic-sparc64
+bin-ia64
+bin-x86_64
diff --git a/mdk-stage1/dietlibc/AUTHOR b/mdk-stage1/dietlibc/AUTHOR
index 6d8ab1a05..3f6a44e6d 100644
--- a/mdk-stage1/dietlibc/AUTHOR
+++ b/mdk-stage1/dietlibc/AUTHOR
@@ -1 +1,3 @@
Felix von Leitner <felix-dietlibc@fefe.de>
+
+Please see the file THANKS for additional authors and contributors.
diff --git a/mdk-stage1/dietlibc/BUGS b/mdk-stage1/dietlibc/BUGS
new file mode 100644
index 000000000..d030db5e6
--- /dev/null
+++ b/mdk-stage1/dietlibc/BUGS
@@ -0,0 +1,8 @@
+Please report bugs to
+
+ felix-dietlibc@fefe.de
+
+or to the mailing list at
+
+ dietlibc@fefe.de
+
diff --git a/mdk-stage1/dietlibc/CAVEAT b/mdk-stage1/dietlibc/CAVEAT
new file mode 100644
index 000000000..efd20d6f5
--- /dev/null
+++ b/mdk-stage1/dietlibc/CAVEAT
@@ -0,0 +1,5 @@
+
+Beware! Much of this code is untested!
+
+Someday, we will have a test suite and everything will be just fine.
+
diff --git a/mdk-stage1/dietlibc/CHANGES b/mdk-stage1/dietlibc/CHANGES
new file mode 100644
index 000000000..24282baa5
--- /dev/null
+++ b/mdk-stage1/dietlibc/CHANGES
@@ -0,0 +1,887 @@
+0.22:
+ fix i386 libm
+ fix netinet/ip_icmp.h (Rui Prior)
+ make strings.h susv3 compliant (Gunnar Ritter)
+ remove stdio dependence in abort
+ fix truncate64, ftruncate64 (Luc Van Oostenryck and Yuri Kozlov)
+ fix and improve erand48() (Luc Van Oostenryck)
+ fix realpath for non-existant directories (Gergely Nagy and Gerrit Pape)
+ fix DNS timeout and IPv6 socket reuse
+ strtoul now accepts "-1" as well (Thomas Ogrisegg)
+ add i386 strcasecmp and __ltostr (Thomas Ogrisegg)
+ add killpg prototype (Luc Van Oostenryck)
+ remove some compiler warnings (Luc Van Oostenryck)
+ better rand() from Knuth's TAOCP (Luc Van Oostenryck)
+ fix unified x86_64 unified syscall 64-bit return value issue (Gwenole)
+ the getdents64 emulation was broken and repairing it opened a can of
+ worms. So I ripped it out. I also changed the readdir64 emulation
+ to work if there is no getdents64.
+ fix ia64 start.S (Thanks to Volker Birk for an account on his ia64 box)
+ many ia64 fixes (waitpid, nice, fork, vfork, time, utime ...)
+ More fixes from Gwenole (printf %p only printed the last 32 bits, I
+ botched the getdents64 #ifdefs, we violated the x86_64 ABI)
+ change signal() to do as glibc does
+ remove a few more warnings
+ add new 2.5 syscall #defines
+ add epoll_create, epoll_ctl and epoll_wait
+ the new x86 syscall numbers exceed 255, breaking our %al optimization
+ I worked around it with conditional assembly in cpp macros. Ugh.
+
+0.21:
+ use gcc's size_t, ptrdiff_t and wchar_t types (Olaf)
+ use -G 8 on MIPS to reduce code size (Johannes Stezenbach)
+ add munlock (Jens Låås)
+ argh, atexit fell victim to bit rot (or maybe Olaf)
+ add WANT_INET_ADDR_DNS to make gethostbyname not look up IP numbers
+ but use them to fill in the struct hostent directly.
+ signal is now a correct signal (Olaf)
+ read optimizer cflags for diet -Os gcc from ~/.diet/gcc, overriding
+ the built-in defaults.
+ add file "SECURITY". I will document design tradeoffs that have
+ security implications there.
+ fixed regex LINEEND condition
+ add .size directive to i386 syscalls
+ shove a few more bytes off the i386 socket calls
+ setjmp, longjmp and clone for x86_64 are now implemented but not tested (Olaf)
+ fix sparc signals
+
+0.20:
+ calloc was botched
+ umount and stime for x86_64 (Gwenole Beauchesne)
+ some malloc fixes for very big numbers (Enrico Scholz, me)
+ x86_64 unified syscall did not preserve rbx violating ABI (Gwenole)
+ realpath fix if path did not contain a slash (Gwenole)
+ add ucontext
+ add asm/statfs.h to work around people using <linux/fs.h>
+
+0.19:
+ current gcc cvs makes __thread a keyword (Eric Troan)
+ be more strict regarding hostile DNS packets (me)
+ fix ia64 compile problems (Gerrit Pape)
+ make killpg a function and not a macro (broke bash 2.05b)
+ fix ia64 start code and unified syscall (me)
+ add sparc/strlen.S from Thomas Ogrisegg
+ add more space to ARM __jmp_buf in setjmp.h (Andre)
+ fix libcompat/syscall.S (did't compile on arm)
+ add integer overflow fix in xdr_array after bugtraq advisory (me)
+ fix x86_64 socket calls and mmap (and some more) (Gwenole Beauchesne)
+ add calloc integer overflow fix after RUS-CERT advisory (me)
+ add fread and fwrite integer overflow fix (me)
+
+0.18:
+ add stpcpy (from Thomas Ogrisegg)
+ check in mktime fix (from Luc Van Oostenryck)
+ add libm2.s from contrib to i386 (oops, how long has it been sitting
+ there?)
+ add truncate64 and ftruncate64 and prototype for truncate (only had ftruncate)
+ Michal Ludvig ported the diet libc to the x86_64 architecture (the
+ upcoming AMD Hammer chips!). You can't even buy the chips yet and
+ the diet libc already supports it! Amazing ;-)
+ Michal's patch also fixed several of the outstanding warnings. Thanks!
+ Andre sent a patch to add ARM profiling. He says it does not work
+ yet, but it's a start.
+ added getdents64 backwards compatibility and include it in large file
+ support #defines
+ perror now checks if the message is NULL like glibc (Thomas Ogrisegg)
+ ftell did not take ungetc into account (Kevin Ryde through Debian).
+ Thomas Ogrisegg sent a port to IA64!
+ sigaddset, sigdelset and setismember segfaulted for signal 0 (Gunnar Ritter)
+ Enrico Scholz reported several bugs in the header files.
+ change __malloc__ to __attribute_malloc__
+ add pa-risc socketcall (but see TODO) (Felix J. Ogris)
+ fix *rand48 initialization (Kevin Ryde)
+ fnmatch infinite loop fix (Piotr Esden-Tempski)
+ make signal() into a sigaction wrapper function
+ add memrchr (Emil)
+ remove __attribute__((const)) from getpid() (Yuri Kozlov)
+ make getserv* also work if proto is NULL (Jens Låås)
+ now clone on parisc works (Thomas Ogrisegg)
+ getopt* fix from Thomas Walpuski
+ add syscall() to libcompat (Thomas Ogrisegg)
+ fix strncpy and strrchr i386 assembly versions for dynamic linking
+ (John K. Hohm)
+ allow short option grouping in getopt* (Ralf Wildenhues)
+ make the DNS resolver IPv6 transport capable (WANT_IPV6_DNS)
+ mention -v in diet.1 (Bryan Henderson)
+ auto-detect gcc 3 on i386 and remove compiler option warnings
+ putenv tweak (Thomas Ogrisegg)
+ add missing socket syscalls for PA-RISC and IA64 (Thomas Ogrisegg)
+ add cpio.h and tar.h (Thomas Ogrisegg)
+ change opendir/readdir/closedir from malloc to mmap (Thomas Ogrisegg)
+ cleanups from Florian LaRoche
+
+0.17:
+ fix several bugs in getservent_r
+ Gunnar Ritter reported the following:
+ moved tcgetpgrp and tcsetpgrp to unistd.h
+ adjusted lstat->lstat64 #define to make it work with function pointers
+ move __dietlibc__ #define from features.h to diet
+ Thomas Ogrisegg sent x86 memccpy and strncpy routines and introduced
+ an dietfeatures.h #define WANT_FULL_POSIX_COMPAT
+ Thomas also sent me profiling support (so far only on x86, but
+ profiling/PORTING describes what needs to be done for other
+ architectures)!
+ add contrib/dprof.c, also from Thomas.
+ Andreas Krennmair sent a patch to add the BSD regex interface to
+ libcompat
+ Andre noticed that __dtostr never sets first to false. Oops!
+ Andre has provided a largely untested patch that seems to fix the problem.
+ Igor Gilitschenski sent a patch for the "%8.7lx" issue.
+ abort did not flush all stdio streams
+ fix some nasty regular expression bugs
+ write a stupid malloc checker (contrib/debug-realloc.c) to help me
+ debug my regular expressions. Please read contrib/debug-realloc.txt
+ our i386 memchr,memcmp were broken for the count=0 case
+ fix DNS domain search
+ i386 memccpy exchanged esi and edi :-( I should do more checks before
+ accepting external code...
+
+0.16:
+ "diet -v" or "diet -Os" segfaulted without further arguments.
+ Andre found two very embarassing bugs in my four lines of md5 glue.
+ I need to get more sleep.
+ Thanks Ogrisegg found that ptrace does not work as documented and
+ provided a wrapper that emulates the glibc behaviour.
+ Dirk Engling saved 8 bytes and 4 cycles in the ARM clone()
+ fix ptrace.h for S/390 and ARM
+ provide a PORTING document so we don't lose track of which file need
+ to be touched to port the diet libc to a new platform.
+ remove a few warnings
+ provide a prototype for usleep.
+ make __dtostr work on ARM by using long instead of long long.
+ Idea by Dirk Engling.
+ fix an argument counting bug in *scanf (Thomas Ogrisegg)
+ Forgot an #endif in asm/sigcontext.h (Mike Castle)
+ Kurt Garloff sent in patches to
+ fix struct termios on non-x86 architectures
+ printf("%+05d\n",500) was broken (Raimar Falke told me, Olaf fixed it)
+ create libcompat.a (and move daemon to it)
+ add getdelim and getline
+ *printf now recognize 'z' integer flag (and ignore it)
+ Dirk Engling provided a strcpy.S for ARM.
+ Olaf: fixed *scanf familie. It hadn't wored with "long long".
+ Hans Lermen fixed i386/getenv.S
+ diet -Os no longer discards -fpic and -fno-pic
+ fix i386 rand/random to use correct RAND_MAX (thanks, Jaroslav
+ Macodiseas)
+ sys/ipc.h now includes sys/types.h
+ Olaf: started to make the sparc64 port
+ scandir should not sort if compar() is NULL (reported by Andrea Marrosu)
+
+0.15:
+ vfork sucks. I reverted to the old behavior where vfork==fork.
+ fix bsearch (and remove i386 assembly bsearch, needs to be redone).
+ Thanks Ogrisegg sent a patch to make the PA-RISC unified syscall
+ thread-safe!
+ remove vfork and add alarm to dynamic syscalls.
+ fix diet-dyn to link in dyn_dstop.o and not dyn_stop.o.
+ The MD5 code generated unaligned accesses when passed an unaligned
+ pointer on little endian ARM and MIPS.
+ MIPS unified syscall didn't compile anymore.
+ Put up new mipsel target to cross compile for little endian mips.
+ The mips target will again explicitly set endianness to big endian.
+ Compiling natively on a MIPS box should not touch the endianness.
+ Duh, when we removed return0, we broke tzset when the time zone parser
+ was disabled. Uwe Ohse noticed this. Thanks!
+ Fix gethostbyname to match host names case insensitively in /etc/hosts.
+ Oops, this was reported 6 weeks ago but I overlooked the email.
+ Thanks, Denis Rachal!
+ vsnprintf's zero termination was broken.
+ Uwe Ohse found a few more bugs:
+ Remove WANT_BUGGY_GLIBC_STRSEP. The Linux man page is broken, glibc
+ does it correctly.
+ Make inet_aton use strtoul instead of strtol
+ fdopen would close the file descriptor if it could not malloc the
+ buffer.
+ strftime updates.
+ Make _FILE_OFFSET_BITS includes -Wundef clean
+ Andre found a typo in endian.h for big endian mips
+ Ryan told me that fmod was not included in libm. Oops.
+ strstr(whatever,"") returned NULL, not whatever. Found by a new test
+ suite entry for strstr that I wrote.
+ Thomas Ogrisegg suggested or sent patches for the following:
+ add <asm/sigcontext.h> for profiling support.
+ make strncpy a #define in string.h to save a few bytes.
+ an i386 assembler getenv implementation (roughly half the size)
+ add grantpt, ptsname, unlockpt
+ add a getenv test suite entry.
+ Andre contributed an ARM assembler md5 implementation and he fixed mmap
+ on ARM.
+ add glibc macro names in sys/reboot.h. Mentioned by Laurent G. Bercot
+ getservent_r did not parse lines without aliases. Thanks, Jaroslav
+ Macodiseas!
+ fix MIPS start code (argv[0] was always corrupt)
+ removed annoying -Wconversion gcc switch
+ add -v to diet.c and fix MIPS CFLAGS in diet. Thanks, Johannes Stezenbach
+ Kurt Garloff sent these diffs:
+ add fdatasync (and make it a pthread cancellation point)
+ numerous alpha issues, like using .quad instead of .long for
+ offsets, change strip to -strip in Makefile (so a failing strip does
+ not abort the make), try to be more friendly to the gcc 2.96 that
+ SuSE 7.1 AXP ships with.
+
+0.14:
+ fix brk again (missing __brk, trivial oversight)
+ a new i386/atol.S that is 4 bytes smaller (and faster, too!). Thanks,
+ Thomas Ogrisegg!
+ Thomas also contributed a PA-RISC port including testandset, so
+ libpthread will work once we implement clone! Great work, Thomas.
+ made the fake locale more believable.
+ If you need gettext, use http://www.ca.postgresql.org/~petere/gettext.html
+ moved _exit into the unified syscall on x86.
+ Uwe Ohse found many more bugs:
+ getpass EINTR handling, ttyname, sysconf_cpus with SLASH_PROC_OK,
+ liblatin1 was more or less completely broken if you gave it chars as
+ arguments, not ints (signedness). execvp had a buffer overflow in
+ case a PATH element exceeded PATH_MAX, but it's not a security
+ problem since setuid programs need to set their path to some known
+ value anyway.
+ hasmntopt did not work with foo=bar style options
+ Uwe also improved ftw's stack usage.
+ Put movl instead of popl rationale in comment in i386/unified.S since
+ three people have suggested saving a few bytes with popl now ;)
+ I discovered __attribute__((malloc)) and started using it. For gcc 3,
+ it improves the optimizer when functions return malloced pointers.
+ Steven Rostedt pointed out that my setvbuf was broken with regard to
+ size==0 and sent a patch to fix it.
+ Thomas Ogrisegg made setenv smaller.
+ Olaf: implemented the parisc clone and an atomic testandset, modified the
+ libpthread to respect the parisc UPgrowing stack. still non functional,
+ because the unified syscall uses errno :(
+ tcgetospeed read from the wrong termios field. Thanks, Gunnar Ritter!
+ Fixed asprintf (relied on vsnprintf(NULL,...) to return length but
+ don't write anything which was no longer the case. It also
+ allocated one byte unnecessarily, which Uwe Ohse found.
+ Fix ttyname (readlink does not \0-terminate, forgot to do that).
+
+0.13:
+ add readdir64 and automatic mapping if _FILE_OFFSET_BITS == 64
+ make diet not include the linker safeguard stuff when preprocessing
+ Olaf: port to S/390!
+ me: fix vfork (it was put into dietlibc.a twice)
+ res_query did not initialize last
+ diet (not diet-dyn, of course) now adds -static to the gcc command line
+ fixed fflush on input streams (tic from ncurses exposed this)
+ duh, there is an alarm system call, too, so we use it and not setitimer
+ fix comparison in gmtime_r that caused Jan 1 to be converted to Dec 32.
+ rewrote __dtostr (it also has one more argument now)
+ Thanks to Erik Troan for bringing these to my attention:
+ make putenv behave like glibc (putenv("HOME") == unsetenv("HOME"))
+ fix strncat for the case where n == 0 (security implications?)
+ fix bsearch (it didn't find the very last element in the array, same
+ bug in both the C and the i386 assembly version).
+ fixed FNM_PATHNAME in fnmatch
+ fix brk (the syscall was documented incorrectly in the Linux man page)
+ Thanks, Thomas Ogrisegg!
+ added negated character classes to fnmatch (not required by POSIX)
+ make the utmp routines open utmp read-only if read-write doesn't work.
+ remove syscalls.c directory, it is obsolete now with unified syscalls
+
+0.12:
+ more contributions from Frank Klemm.
+ iconv can now do UCS-2, too.
+ Imported several x86 assembly routines from Wouter van Kleunen.
+ Lots of bug fixes, and several more i386 specific versions of common
+ routines to make them smaller.
+ add memmem (a GNU extension that looks useful)
+ several changes from Michal Ludvig: inttypes.h gets C99 macros,
+ add pivot_root syscall, %n for *scanf.
+ add adjtimex (thanks, Laurent BERCOT)
+ add Frank Klemm's optimized md5
+ add -Os option to diet (see diet.1).
+ several IPv6 constants and HZ were missing, thanks Johannes Kloos.
+ add 32-bit uid/gid syscalls.
+ add rand48 (thanks, Johannes Kloos)
+ fixed a lot of bugs in getopt* (thanks, Johannes)
+ add strxfrm and tweak limits.h. glib-1.3.8 now compiles without changes.
+ add a few more module syscalls. modutils-2.4.9 now compiles without changes.
+ fix gethostent alias list termination. Major oops.
+ add execle and two DNS constants (from Johannes Kloos).
+ opendir did not close-on-exec (thanks, Laurent Bercot).
+ DNS will now properly signal errors and set h_errno.
+ A few more cleanups (thanks, Andreas Jabs and Matthias Andree).
+ Added an uber-cool linker safeguard feature! Idea by Matthias Andree.
+ If you enable WANT_SAFEGUARD in dietfeatures.h, diet will include an
+ external reference to a symbol that is only in the diet libc. So,
+ when you accidentally link a diet libc compiled object file against
+ glibc, the linker will barf. This will bloat your object files, but
+ you can remove all the references with "strip -R .note" from
+ the binaries in the end (which you should do anyway).
+ fix ARM unified syscall (select did not work).
+ add getpwent_r ala glibc and replace getpwent
+ do the same for getgrent and getspent
+ remove entlib (new code is smaller)
+ rewrite getserv* to use parselib (and provide ..._r, too)
+ add getpwnam_r and getpwuid_r
+ rewrite getproto* to use parselib (and protive ..._r, too)
+ Olaf muddled with the dynamic linker. It's a clean-room
+ implementation in the sense that it once worked for Olaf in a clean
+ room ;)
+ add if_nameindex and if_freenameindex.
+ fixed arm unified syscalls to work with current binutils (; is no
+ longer a line separator but starts a comment, switched to .macro)
+ changed all st_[cma]time types to signed long so comparisons against
+ LONG_MIN will work correctly. (GNU tar does this)
+ fixed two bugs regarding ungetc.
+ add getusershell, setusershell, endusershell (for vs_ftpd)
+ add prctl, dirfd (also for vs_ftpd)
+ fixed strftime (was completely hosed)
+ added real make install target
+
+0.11:
+ fix major oops in DNS routines (only with WANT_FULL_RESOLV_CONF enabled).
+ fix vsscanf bug (Thanks, David Chappell).
+ add floor, ceil and memchr prototypes.
+ add __builtin_expect and expect #defines for gcc versions below 3.0
+ cleaner errno vs __errno_location handling
+ add placeholder iconv (iconv_open will always return EINVAL)
+ try to remove kernel 2.4 header dependency in IPv6 sockaddr_in6
+ initialization of getaddrinfo.
+ fix vsnprintf %X (printed lower case)
+ I wrote a new getopt. It appears to actually work (it is POSIX
+ compliant, it does not sort argv like the GNU version) and is only
+ a little over 300 bytes on x86.
+ Guillaume Cottenceau just wrote me that strncat should be even more
+ broken than it already is: it should append n bytes AND THEN \0!
+ I wonder how many programmers have produces off-by-one errors here...
+ Fix regexec offset return. autoconf now believes that diet libc has
+ POSIX regular expressions.
+ Fix fnmatch (a/b/* matched a/b/c/d even if FNM_PATHNAME was set)
+ Fix regular expression match for x* when there is no x at all.
+ Fix memory leak in error case in gethostbyname(2|). Thanks, Dietz Pröpper.
+ Add %h to vsnprintf.
+ Add FAQ.
+ Make %h work for signed numbers and add %hh to vsnprintf.
+ initgroups ignored the group argument :-(
+ remove printf references and nested functions from glob.
+ added an errno in libpthread that will display a prominent linker
+ warning.
+ started getting rid of kernel headers. Big task! :-(
+ add res_mkquery. The diet libc can now compile and link mtr.
+ Olaf: added a lot of code in libdl (not yet complete), changed the
+ startup code to make it work with his libdl and ld.so (needs still work
+ too)
+ __dns_readstartfiles only took the first domain or search path.
+ Thanks, Anthony de Boer
+ Olaf: added clone and a new unified_syscall for PowerPC
+ also dynlinker is now available (i386 only at this time)
+ crufted together a stdarg.h implementation from the various gcc headers.
+ implement getopt_long (ugh, the GNU people need professional help)
+ fixed word delimiters in regex (they looked for space, i.e. "," did
+ not work as delimiter)
+ errno.h now declares sys_errlist and sys_nerr.
+ added mkdtemp.
+ Uwe Ohse reported all of the following bugs:
+ ttyname should return 0 if !isatty.
+ realpath returns NULL if "." cannot be opened
+ putenv erroneously accepted (and mishandled) entries without "=".
+ popen returned 255 instead of 127 if /bin/sh could not be run.
+ fgetc did not set the internal EOF indicator on EOF.
+ bsearch contained an assumption about integer arithmetic overflow
+ behavior.
+ system did not set SIGCHLD and thus contained a race.
+ popen did not set close-on-exec and could leak an fd on malloc error.
+ daemon did not check whether open returns an fd below 3
+ perror did not save errno.
+ Olaf: Peter Jones reported some problems with perror; strerror had the
+ same problem.
+ Peter also posted a patch to atexit/exit. With some modifications it is
+ now implemented.
+ Unbuffered stdio and ungetc can no longer be disabled. I will try to
+ implement part of it using ELF weak symbols.
+ Added minimal sysconf (tehe) from David Chappell.
+ Added overflow handling for strtoul and strtol.
+ Added WANT_ETC_HOSTS in dietfeatures.h and made gethostbyname/2 use
+ it before falling back to DNS if enabled.
+ Added a littie backwards compatibility cruft for gpm (man, do these
+ sources stink!)
+ Added openpty.
+ Squeeze a few bytes off the is* routines, courtesy of Peter Jones.
+ Fix fseek return value.
+ Add dirname and basename.
+ Add a few i386 math routines contributed by Frank Klemm.
+ Fixed getservent (did not allow _ and - in the aliases).
+ Thanks, Oden Eriksson
+ Added a float.h so configure believes we have ANSI header files.
+ Fix a lot more stdio bugs that Uwe Ohse pointed out.
+ Olaf: has added a new scanf and printf core that is suitable for all
+ scanf and printf function implementations
+ Imported a few more functions and optimizations from Frank Klemm (he
+ also rewrote dtostr to have more precision)
+ Olaf: checked in a new sig* function family (based on rt_sig*).
+ legacy <2.2 signal-handling doesn't work at the moment.
+ Made rudimentary iconv that can convert back and forth between
+ iso-8859-1, utf-8 and ucs-4 (for debugging).
+ Thanks to Markus Kuhn for the excellent utf-8(7)!
+
+0.10:
+ update getpagesize.
+ add personality.
+ add "%*s" and "%*.*s" support to vsnprintf.
+ add putchar (apparently arm-linux-gcc will substitute printf("\n")
+ with putchar('\n') behind your back...?!
+ import include/scsi/ from glibc.
+ add iopl.
+ add execl and sigdelset prototypes.
+ add getopt_long stuff to getopt.h (may compile but won't link).
+ add RPC headers (no code yet).
+ add mlockall, munlockall
+ make "diet gcc foo.c" work.
+ added Sun RPC code and removed as many warnings as possible in a
+ heroic act of self-mutilation.
+ added getproto* and getdtablesize for the RPC cruft :-(
+ added getpass. mount from util-linux actually compiles now!
+ fix the sig*set routines. mount actually works now *bg*
+ fix fwrite dividing by zero when trying to fwrite n records of size 0.
+ added an initial regex implementation (3500 bytes!!!).
+ add llseek and lseek64 with optional lseek fall-back.
+ add res_init.
+ add asprintf (ugh, what an ugly function).
+ expanded arpa/nameser.h to include backwards compatibility defines
+ add ut_name alias to ut_host in struct utmp.
+ add inet_ntop, inet_pton, gethostbyname2.
+ add sysinfo, recvmsg, sendmsg.
+ add endmntent, getmntent, setmntent.
+ fix fnmatch (thanks, Guillaume Cottenceau!)
+ add setenv.
+ remove __restrict from mntent.h, add __restrict__ removal alias for
+ older gcc versions in sys/cdefs.h.
+ add rlim_t, sig_atomic_t declarations.
+ add sigsetjmp #define for __sigsetjmp (oops).
+ (Thanks to Chris Siebenmann for these three bug reports)
+ add a gruesome hack to printf floating point to accept %f and kludge
+ together support for %.2f. Don't look at the code, please!
+ fixed tcsetpgrp (oops, this is embarassing! Thanks, Chris Siebenmann)
+ imported fix for entlib by Jeff Garzik.
+ add glob implementation from Guillaume Cottenceau (Thanks!!)
+ add libdl fragments from Olaf (Yeah! One step closer to dynamic linking!)
+ add REG_ICASE and word start/end handling to my regular expressions.
+ my regular expressions now actually match substrings (i.e. "foobar" to "bar").
+ wrap getcwd to comply to man page (the syscall returns the number of
+ bytes, not the buffer)
+ add realpath.
+ fix vfprintf.
+ fix *scanf %s zero termination.
+ add abs, labs, llabs.
+ add <sys/io.h>, ioperm syscall.
+ add flock to <sys/file.h>
+ fixes to bsearch and the regular expressions.
+ add fake herror.
+ add scandir and alphasort.
+ add killpg
+ implemented a gross hack to make libpthread compile when
+ dietfeatures.h does not define WANT_THREAD_SAFE (it's empty then).
+ add getaddrinfo and freeaddrinfo (man, what a fucked up interface!)
+ fix sigsuspend (syscall had completely fscked up arguments!)
+ RLIM_INFINITY from the kernel is broken. Thanks to Chris Siebenmann
+ for sending a patch.
+ add getserv*.
+ add WANT_FULL_RESOLV_CONF so that the DNS routines use "domain" and
+ "search" from resolv.conf.
+
+0.9:
+ fixed initgroups (oops)
+ Cleanup appending file open for stdio (thanks, James Antill)
+ imported vfprintf fix from James Antill.
+ add fnmatch
+ change index, rindex and bcmp as weak ELF symbols (were #defined before)
+ Olaf added character classes to *scanf.
+ Put object and library files into a separate directory (bin-$ARCH).
+ Add "cross" make target to make all architectures.
+ Add "diet" program and man page.
+ Add getgrnam, getgrgid
+ Add cfmakeraw (Thanks, Antonio Musumeci)
+ localtime won't call gettimeofday when the tzfile parser is used.
+
+0.8:
+ vsnprintf(0,...) estimated the length of strings with a padding width
+ incorrectly.
+ new reboot() from Olaf.
+ added prototypes for getsockopt and setsockopt.
+ added experimental sem* and shm*
+ define EXIT_SUCCESS and EXIT_FAILURE
+ added setvbuf (only changes mode, not buffer)
+ added dietwarning.h (woohoo, linker warnings!) and used it to warn of
+ insecurity (system, sprintf) or bloat (printf and stdio).
+ added qsort() and bsearch(). Benchmark on 1000 random ints:
+ glibc: 679414 cycles qsort and 3352 cycles bsearch
+ diet libc: 300010 cycles qsort, 553 cycles bsearch
+ I have no idea why glibc is so slow.
+ added __isnan (references by libm.a from glibc).
+ added popen() and pclose(). Now the diet libc can link slsh (from
+ S-Lang!)
+ corrected usleep. It was more of an msleep until now.
+ corrected __dtostr (it looped when trying to format "0.0").
+ several fixes to stdio (thanks to S-Lang's excellent test suite!)
+ added ungetc (does it work?)
+ added inet_aton (yuck!)
+ added gethostbyname, gethostbyaddr, gethostbyname_r and gethostbyaddr_r
+ added h_errno and __h_errno_location
+ added inet_ntoa
+ added setpgrp and getpgrp, strsignal and execv (thanks, Olaf)
+ add bcopy, index, rindex macros
+ add isgraph and isxdigit
+ add strftime (ugh!!!)
+ Olaf fixed strftime, gmtime_r leap year bug.
+ Jeff Garzik contributed a spec file. I put it in contrib and hope
+ everbody knows what to do with it...
+ Olaf checked in a ton of libpthread stuff.
+ added mkstemp using /dev/urandom (harder to guess than getpid()).
+ add large file backwards compatibility support (so gzip will run on
+ kernel 2.2 and 2.0)
+ added shutdown
+ added nice
+ added pseudo-locale support for is* (they are now weak aliases,
+ isupper -> __isupper_ascii etc). So, for example, liblatin1 can
+ overwrite the default is* functions.
+ added liblatin1.a
+ added tzfile implementation (does it work for anyone else?)
+ added syslog(3) (thanks to Rene Müller!)
+ Jeff Garzik contributed getgr*, getpw* and getsp* in one tiny package.
+ Thanks!
+ merged duplicate code in execv and execvp into exec_lib.o
+
+0.7.2:
+ added several prototypes to already implemented functions and
+ <sys/reboot.h>. Thanks for Abraham for pointing this out.
+ added prototypes for process group and dup syscalls. Thanks to
+ Abraham again. He also contributed an implementation for daemon(),
+ an ugly BSD hack. I decided to diversify the lib/ directory a
+ little and now created a libugly/ directory for stuff like system()
+ and daemon() ;-)
+ added libstdio and moved all that stdio crap from lib/ there. The
+ idea is to start separating now what we will separate for shared
+ libraries anyway.
+ optimized x86 unified-syscall by Olaf.
+ added limits.h, removed __ARCHBITS from endian.h (use __WORDSIZE from
+ limits.h instead)
+ added remove.c and enough cruft to limits.h to make it compile lzo,
+ lzop and bzip2.
+ added mktime, asctime_r, asctime and ctime (needed for gzip).
+ Someone will need to implement a reader for the glibc localtime file
+ format some day (man tzfile, ugh!) :-(
+ added unlink prototype to unistd.h.
+ added gmtime and gmtime_r.
+ fixed sparc unified syscall error handling (please upgrade!).
+ removed readdir glibc compatibility cruft.
+ removed stat glibc compatibility cruft.
+ oops, my fread was broken for pipes.
+ Olaf found a bug in pipe() for sparc, too.
+
+0.7.1:
+ optimized away the static arrays from __ltostr and __lltostr.
+ optimized away the static arrays (and more!) from strtoul and strtoull.
+ added system (by Olaf).
+ added tolower and toupper
+ added getopt from Olaf (~600 bytes on x86!)
+ added clone for mips (by Olaf).
+ fixed longjmp and setjmp on sparc not to require glibc include files.
+ added pause for all (by Olaf).
+ added __attribute__ ((__const__)) to ctype.h
+ added isupper and islower.
+ added putc and putchar as macros.
+ added strcasecmp and strncasecmp (thanks to Abraham vd Merwe for
+ insightful discussions and patches I partially used for the last three)
+ added getpriority and setpriority (also by Abraham)
+ oops, I broke strtoul in a recent optimization attempt.
+ oi, setjmp and longjmp were broken on other platforms, too!
+ Thanks to Sébastien Côté for reporting this.
+
+0.7:
+ clone support for i386,alpha,arm and sparc by Olaf.
+ Initial dynamic loading glue for i386, also by Olaf.
+ We don't have a dynamic loader yet, so this is not yet usable.
+ added readv, sigdelset, sigaltstack, sigfillset, sigismember, usleep,
+ vsprintf, writev, all by Olaf.
+ imported readdir fix from Guillaume. Mhh, can the kernel interface
+ really be this broken?
+ Found a kludgy way to detect whether the kernel includes define struct
+ stat64 (they also define STAT64_HAS_BROKEN_ST_INO). If this does
+ not work for you, please tell me!
+ Removed bogus __seek_types enum, it's a bunch of #defines now.
+ Fixed stdio line buffering. The code was already there but I forgot
+ to mark stdio and stdout as line buffered. This should really be
+ done dynamically using isatty, though.
+ Removed superfluous "if (1)" in execvp.c
+
+0.6.14:
+ *scanf did not append the 0 byte for %s.
+ added creat and changed creat to call open directly instead of open64.
+ did for fread what 0.6.10 did for fwrite.
+ repaired buffered stdio a little (line buffering is still not
+ supported).
+ [All of these bugs have been reported by Guillaume. Thanks!]
+ added __pure__ to strchr and strrchr in <string.h>
+
+0.6.13:
+ included COPYING to make clear that the diet libc is covered by the
+ GNU General Public License (and _not_ the LGPL). That means that
+ you need to obtain a license from me if you want to use the diet
+ libc in a proprietary program that you want to distribute.
+ The x86 unified syscall swapped arguments #4 and #5 and noone
+ noticed until now! Thanks to Guillaume Cottenceau for reporting
+ this!
+ The malloc had a subtle bug with small allocations that could cause
+ segfault. Guillaume reported it, Olaf fixed it.
+
+0.6.12:
+ added assert, statfs and fstatfs
+ added include/net/if.h so fget compiles again.
+
+0.6.11:
+ added putenv.
+
+0.6.10:
+ fixed fwrite. It returned the number of bytes written, not the number
+ of records. Thanks to Albert D. Cahalan for pointing this out.
+ fixed fgets. It returned EOF on empty lines. Thanks, Erik Frey.
+ added brk and sbrk. harold@nb.com.sg made me do it.
+
+0.6.9:
+ fixed execvp not to return on ENOENT
+ did for {open|read|close|seek|tell}dir what I did for stat before.
+ The glibc compatibility part is currently non-functional.
+ fixed white space handling in sscanf " (" would not match " (".
+ fixed printf to accept 'l' flag.
+ fixed getpwuid (ignored last line)
+
+0.6.8:
+ Olaf contributed initial thread-safe syscalls for i386, alpha, sparc,
+ mips and arm. I did the one for ppc. They can be enabled in dietfeatures.h.
+ added strlcpy and strlcat from OpenBSD.
+ added stat64, fstat64 and lstat64.
+ added endian.h and made ending of strlen.c endianness-aware
+ added string routines size tweak to dietfeatures.h. Most of the
+ string routines have been unrolled. This is up to three times as
+ fast but creates up to three times larger code. Now you can disable
+ the unrolling.
+ added sendfile.
+ I also added pread. It works on x86 and sparc but not on ppc and mips.
+ I have no idea what's going on. strace disagrees with the kernel.
+ Can anyone help? I asked the Linux kernel mailing list for help, too.
+ added a few aliases of the type __libc_open for open. nm on
+ libpthreads.so indicates that we will need them.
+
+0.6.7:
+ the sources now compile without warnings with -Wall.
+ printf now prints "(null)" when %s is passed NULL. This can be
+ removed with WANT_NULL_PRINTF in dietfeatures.h
+ added vfprintf, execl, ttyname.
+ stat, lstat and fstat are now #defined to __dietstat, __dietlstat and
+ __dietfstat so they can use the normal kernel struct stat.
+ stat, lstat and fstat are now C wrappers that convert to the glibc
+ struct stat. So we can avoid that overhead for programs that use
+ dietlibc headers.
+
+0.6.6:
+ changed the Makefiles so you can now set CFLAGS on the command line
+ added memccmp (analogous to memccpy) and strncmp.
+ Olaf fixed another bug in the sparc unified syscall.
+ Paul Clifford contributed a C version of his strlen.S that is much
+ more efficient than the previous strlen on all platforms! It also
+ looks like technology from Roswell. ;-}
+ added a "real" stdio. Well, almost. Please contribute!
+ added dietfeatures.h so you can remove features you don't need.
+ removed debug code from vsnprintf that changed \0 to ' ' (argh!).
+ stdio now works with simple programs and minigzip from libz.
+ stdio uses some major trickery to avoid linking the stdio, stderr and
+ stdout (and reserving space for them) when they are not used.
+
+0.6.5:
+ Red Plait <redplait@ixcelerator.com> found several bugs in diet libc,
+ most of them bugs in the new header files, but also missing sigset
+ functions.
+ Paul Clifford contributed an assembly strlen.S for ARM and fixed
+ several bugs.
+ Fixed ppc/setjmp and mips/pipe.
+ Olaf contributed a new sparc unified syscall.
+
+0.6.4:
+ declared is* static inline in getservent.
+ added assert_fail, strtoul, isalpha, isdigit, isalnum, isascii.
+ changed strlen to return 0 when passed NULL.
+ new, much smaller unified syscall for MIPS. Thanks to Olaf the Mad
+ Scientist who actually implemented this without access to a MIPS
+ box, just from reading the architecture manual. And it worked out
+ of the box.
+ started a set of system includes, mainly so that I can use lcc and
+ my alpha-linux cross compiler (which is unable to cross-compile
+ glibc). diet libc can now be compiled without any include files
+ from a normal libc. The includes do declare more than diet libc
+ currently delivers and they are still far from complete for real
+ applications.
+ I will only add assembly versions that are smaller _and_ faster than
+ the C version. Larger routines are only accepted if they are called
+ very often and are substantially faster.
+ added i386 assembly strchr, which is smaller and faster than the old
+ version. It is, however, larger than the version contributed by
+ proton (thanks, anyway).
+ added i386 strlen (31% faster, 14% smaller)
+ "make t" will now create a map file called "mapfile".
+
+0.6.3:
+ added sys_errlist, strerror and perror
+ added isblank
+ added atol
+
+0.6.2:
+ mmap for ARM didn't compile. Thanks, Paul!
+
+0.6.1:
+ split mmap into the architecture specific subdirectories.
+ getenv now copes with environ==NULL, thanks Paul Clifford.
+ Paul also contributed a smaller ARM startup code.
+
+0.6:
+ strcat returned the wrong result. Thanks, Dietz Pröpper.
+ strtod now understands a negative exponent (oops, thanks Bertram Barth)
+ Port to arm-linux-gnu, but on the Netwinder I use for testing the
+ __dtostr does not work (I have no idea why!)
+ The MIPS port now uses (much smaller) non-PIC code. That means that
+ the applications you link against diet libc also have to be compiled
+ non-PIC. I suggest copying the CFLAGS from the diet libc Makefile.
+ Thanks to Ralf Bächle for helping me with this!
+ I made subdirectories for the architectures and use VPATH to override
+ VPATH so that make finds the source file automatically. That should
+ simplify the sources greatly.
+ Olaf Dreesen contributed Alpha support including setjmp and longjmp!
+ ARM and MIPS now also have setjmp and longjmp
+ "compile" and "load" are now make targets. Use them for djb programs.
+ added contrib/elftrunc.c which will remove unnecessary ELF headers.
+ Again, contributed from Olaf. Great work!
+
+0.5.12:
+ printf also does signed numbers.
+ If you don't use atexit, dietlibc now does not link exit, only _exit.
+ *printf now correctly returns the number of bytes written.
+ Olaf contributed experimental sscanf and vsscanf implementations.
+ If passed NULL as buffer, snprintf will not write anything but still
+ return the number of bytes it would have written.
+ Initial MIPS port! (Oh, the agony!)
+ No setjmp and longjmp support yet! Please contribute!
+ I even implemented unified syscalls for MIPS. Still, MIPS code is
+ almost twice the size of SPARC code. If anyone knows why: please
+ tell me!
+
+0.5.11:
+ I implemented new unified syscalls for x86, sparc and ppc, this time based
+ on .s files and not .c files, and I moved the syscalls into
+ subdirectores to clean the dietlibc sources up a little.
+ A binary consisting of printf("%s is %d\n","olaf",23) is now
+ 2864 bytes on sparc
+ 2488 bytes on intel
+ I kludgily implemented fprintf(stdout,... and fprintf(stderr,...
+ to make a few more applications work.
+ Olaf Dreesen also implemented some unified syscall stuff for x86.
+ He discovered that with our unified syscall interface it actually
+ costs <10 bytes total to make all system calls thread safe!
+ I implemented atexit() (can register up to 4 callbacks).
+ I implemented strtod and __dtostr (the opposite). Now we can add
+ floating point support to vsnprintf and sscanf!
+
+0.5.10:
+ I actually saw that I can not only merge the errno handling code of
+ the system calls on x86, I can also merge the rest (including the
+ arguments) except for setting the system call number. All those
+ system calls are now just a jump to a unified system call handler.
+ I got rid of x86openclose again. The savings are substantial:
+ chown from embutils went from 7664 to 7184 bytes!
+ If I'd move the system call wrappers to assembly language, I could
+ even reduce the alignment (does not matter since it's just a jump
+ anyway) and get rid of the "ret" behind each jump (one byte per
+ system call!)
+
+0.5.9:
+ added memchr, strpbrk, strstr, strtol, isspace (hehe)
+ fixed strdup
+ fixed return values for strcpy and strcat (thanks to Norbert Berzen)
+ Olaf Dreesen contributed a strtol and initial {sn|vsn|}printf implementation
+ (no signed integers, only strings and unsigned integers (but
+ supporting octal, hex and decimal). Thanks, Olaf! (by the way:
+ that code must be wonderful, I don't understand it at all *bg*)
+ Olaf's printf does understand padding like in "%08d" and "%8d" and
+ automatically pads pointers with '0'.
+ Rewrote the x86 start code, old: 22 instructions, new: 12 instructions.
+ Thanks to proton for inspiration on this.
+ The new x86 start code also does not reference exit any more, thus saving
+ 64 bytes for executables that don't call exit explicitly.
+ [insert maniacal laughter] EVERY BYTE COUNTS!1!! ;-)
+ Moved errno and environ to start.S, saving no byte binary size but
+ speeding up compilation and slightly shortening dietlibc.a ;-)
+ For x86: joined open and close into one assembler file, sharing the
+ errno handling. This is a feasibility test and it actually saves a
+ few bytes. I think I will reimplement the _syscall[1-6] macros on
+ all platforms now to share the errno handling code for them.
+
+0.5.8:
+ fixed strchr to be able to look for 0.
+
+ added _llseek, ftruncate, getpgid, getresgid, getresuid, getsid,
+ memccpy, memmove, mprotect, setregid, setresgid, setresuid, setreuid,
+ strncpy, swapon, truncate, strtok, strtok_r, strspn, strcspn (all
+ contributed by Olaf Dreesen)
+
+ added execvp, getcwd
+
+ fixed __xmknod
+
+ Note: can it be that the ftw interface really is so broken that I
+ cannot implement it without having to implement some searching data
+ structure? I included an experimental ftw implementation that will
+ not follow symlinks.
+
+0.5.7:
+ oops, if_nametoindex was broken!
+
+0.5.6:
+ ported to ppc-linux.
+ fixed i386 sigsetjmp (I mistyped the function name)
+ included sigjmp.c
+
+0.5.5:
+ added wait, sys_siglist, longjmp/setjmp/sigsetjmp for i386 and sparc
+ actually, it wasn't fork that wasn't working for sparc, it was pipe.
+ I fixed it now.
+ dietlibc/SPARC assumes -msupersparc (does not provide div, mul, etc)
+ fixed readdir to use getdents and not the intel inline asm
+
+0.5.4:
+ ported to sparclinux (sparc32 only). Beware: does not work yet.
+ added raise, abort, readlink, strcat, geteuid, geteuid, wait3, access
+
+0.5.3:
+ added tcsetattr and getenv to compile e3
+
+0.5.2:
+ added vhangup, tcgetattr, isatty and memcmp for fgetty
+ (http://www.fefe.de/fgetty/)
+ added localtime from uC-libc.
+
+0.5.1:
+ stat and friends actually work now. Yuck! Another case of
+ translation between kernel and userland. Why can't the kernel
+ people and the libc people simply agree on a standard?
+ removed many unnecessary includes to speed up compilation.
+ added -fomit-frame-pointer and i386 compilation target to reduce code size.
+ inlined socketcall to reduce code size.
+ "load" and "compile" are examples for djb code.
+
+0.5:
+ Olaf Dreesen contributed a much smaller implementation of malloc and friends.
+ each object file is now treated with "strip -x -R .note -R .comment"
+ split each system call into a separate object file
+ added ntohs, htons, alarm, if_indextoname and if_nametoindex
+
+0.4.1:
+ oops, the strchr implementation was wrong. Thanks Jens Laas!
+
+0.4:
+ copied opendir and friends from uC-libc.
+ added getservent and getservby* in gerservent.c
+
+0.3:
+ remove readdir system call
+ added getdents system call
+ added getpwnam/getpwuid implementation in getpwnam.c
+ added a few string functions (in str*.c)
+
diff --git a/mdk-stage1/dietlibc/COPYING b/mdk-stage1/dietlibc/COPYING
new file mode 100644
index 000000000..5b6e7c66c
--- /dev/null
+++ b/mdk-stage1/dietlibc/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/mdk-stage1/dietlibc/FAQ b/mdk-stage1/dietlibc/FAQ
new file mode 100644
index 000000000..02bae3dcd
--- /dev/null
+++ b/mdk-stage1/dietlibc/FAQ
@@ -0,0 +1,209 @@
+diet libc FAQ.
+
+
+Q: How do I compile this? I don't see a configure?
+A: Just type make.
+
+
+Q: How do I install it? make install?
+A: Yep. It will then install itself to /opt/diet, with the wrapper in
+ /opt/diet/bin/diet. Or you don't install it at all.
+ The diet libc comes with a wrapper called "diet", which can be found
+ in bin-$(ARCH)/diet, i.e. bin-i386/diet for most of us. Copy this
+ wrapper somewhere in your path (for example ~/bin) and then just
+ compile stuff by prepending diet to the command line, e.g. "diet gcc
+ -pipe -g -o t t.c".
+
+
+Q: How do I compile programs using autoconf with the diet libc?
+A: Set CC in the environment properly. For Bourne Shells:
+
+ $ CC="diet gcc -nostdinc" ./configure --disable-nls
+
+ That should be enough, but you might also want to set
+ --disable-shared and --enable-static for packages using libtool.
+
+
+Q: My program complains about missing asm/* or linux/* header files!
+A: It is quite linux specific. You can try omitting the -nostdinc, but
+ except for some cases conflicts are likely. You should not be using
+ the kernel headers in your software.
+
+
+Q: Do you have cross compiling support?
+A: Yes. Just type something like "make ARCH=arm CROSS=arm-linux- all".
+ For arm, alpha, mips, ppc, sparc and i386, shortcuts exist. You can
+ also use "make arm", for example. You still use the same "diet"
+ program as for normal compilation, but you can then say
+
+ $ diet sparc-linux-gcc -pipe -g -o t t.c
+
+ Programs using autoconf can be configured like this:
+
+ $ CC="diet sparc-linux-gcc" ./configure --disable-nls
+
+
+Q: There are a few warnings about possibly uninitialized variables when
+ compiling the diet libc. Can't you remove them?
+A: This type of warning can only be removed by a) compiling without
+ warnings or b) initializing the variables in question. In all cases,
+ the variables won't actually be used uninitialized, but adding an
+ explicit initializer will add a few bytes of code. As you know, the
+ goal of the diet libc is to not waste a single byte of code, so we
+ don't add initializers ;-)
+
+
+Q: When linking binaries, I get warnings about stdio and printf all the
+ time. What gives?
+A: Since the diet libc was written to make writing small programs
+ possible, it also tries to assist in the process of seeing causes of
+ bloat. Premier causes for bloat are stdio and the printf family of
+ functions. The diet libc will also warn you if you still use
+ assert() (which is normally not enabled in production code) or if you
+ use functions that use static buffers (like gethostbyname and
+ friends).
+
+
+Q: My program stopped parsing command line arguments properly! Now what?
+A: The getopt in the diet libc adheres to the Single Unix Specification.
+ In particular, it initialized optind to 1 (not 0) and breaks if
+ someone sets optint to 0 (as some misguided legacy programs to).
+ Also, it does not reorder arguments, i.e. something like "rm -f foo -v"
+ will not see -v as option but rather as non-option argument. If you
+ need GNU getopt behaviour, please use GNU getopt instead of the diet
+ libc code.
+
+
+Q: I get linker errors about missing __ctype_b!
+A: This happens when you link in code that was compiled with the glibc
+ headers. The most common culprit is a library like -lncurses,
+ -lcrypto or -lresolv. All external libraries you use have to be
+ compiled with the diet libc headers (CC="diet gcc"), and there is no
+ libresolv with the diet libc, it's in the main libc!
+
+
+Q: My program links, but when I run it, I get no output at all and it
+ appears to terminate immediately.
+A: This normally happens if you link in glibc. The major reason for
+ this was that shared libraries were linked in. diet sets -static
+ since version 0.13, so if it still happens to you, you need to strace
+ and debug your software.
+
+
+Q: Why aren't you compatible to glibc? I thought the interface was a
+ standard?
+A: Yes, the interface is, but a lot of details are missing. For
+ example, the diet libc uses a different "struct stat" layout than
+ glibc. We use the one from the kernel, glibc uses an own one and
+ links in translation code. This is part of the reason why glibc is
+ so big and ugly. If we support all of this, we end up as bloated as
+ glibc.
+
+
+Q: Where is the test suite?
+A: The humble beginnings are in the "test" directory, but it can't be
+ run automatically yet.
+
+
+Q: GPL sucks! Now I can't compile my BSD programs with the diet libc!
+A: Wrong. You can compile them, and you can use them. You just can't
+ redistribute the binaries. If you are a distribution vendor and want
+ to use the diet libc to make BSD licensed binaries for the install
+ or rescue floppy which you sell commercially, please talk to me.
+
+
+Q: Where are the shared libaries? make install didn't install them!
+A: You have to explicitly build them with "make dyn". Since they are
+ experimental and only supported on a small subset of the platforms,
+ that is not default. Also, I recommend you only use shared libraries
+ if you really know what you are doing. For example, you can't just
+ use your system shared libraries, because they have a dependency on
+ glibc in them, so the program will crash. And you have to explicitly
+ compile the code with -fPIC or -fpic. You can then use them by
+ substituting "diet-dyn" for "diet" on the command line.
+
+
+Q: My target platform does not have a MMU. Should I be using uClibc?
+A: I am not aware of any issues with MMU-less systems. You should be
+ able to use the diet libc just fine. Having a MMU or not is mostly
+ an issue for the kernel, not libc.
+
+
+Q: How do I make myself a cross compiler?
+A: untar binutils and gcc (I used version 2.11.2 and 3.0.4 respectively)
+ Then use the --target=arm-linux (or whatever platform you want)
+ configure options. For gcc, add --enable-languages=c (otherwise gcc
+ will try to make C++, Objective C and Java, too, and those
+ compilations will fail because they require installed libc headers
+ which you don't have yet). I recommend using --enable-static
+ --disable-shared, too, because otherwise the binutils shared
+ libraries will overwrite each other if you install more than one
+ cross binutils for different targets.
+ binutils$ ./configure --enable-static --disable-shared --prefix=/opt/cross --target=arm-linux
+ gcc$ ./configure --enable-static --disable-shared --prefix=/opt/cross --target=arm-linux --enable-languages=c
+ For some platforms, gcc compilation will fail while trying to compile
+ some part of libgcc.a because it depends on some libc header file.
+ This is a gcc bug and you should complain using gccbug, because you
+ can't cross-compile libc unless you successfully installed the cross
+ compiler.
+
+
+Q: Where are the xdr_* symbols?
+Q: Where are the RPC symbols?
+Q: util-linux says that rpcgen output does not work?!
+A: Add -lrpc. The code is from Sun and frankly it is so ugly and so
+ rarely used that I don't want to include it in libc.
+
+
+Q: I am missing some BSD/GNU extension!
+A: I started adding a few of them to libcompat. You have to link it in
+ manually, though, as using them is bad for portability and I want
+ people to make a conscious effort to write non-portable applications
+ by not including them in the libc itself.
+
+
+Q: I'm just starting with the diet libc. Should I use the tarball or
+ the CVS version?
+A: Always use the CVS version. We generally don't add unstable test
+ stuff on the CVS tree, and our APIs are stable (they are
+ standardized, remember?). In fact, we don't add much stuff at all.
+ Most changes are bug fixes and optimizations, and in general you'll
+ want those.
+
+
+Q: Does the diet libc support profiling (with gprof)?
+A: There is experimental support for profiling, but so far it only works
+ on x86. To use it, do "make profiling" before make install. Then,
+ diet will link in the support code if it finds a -pg on the gcc
+ command line.
+
+
+Q: I get compiler errors in a line with caddr_t, u_long, n_short or
+ nlong or similar.
+A: Add -D_BSD_SOURCE to the compiler command line. The diet libc tries
+ to encourage portable and standards compliant programming, so it
+ hides these legacy BSD types from the standard name space. The
+ reason is that the Single Unix Specification contains a specification
+ of the socket API but does not mention those types.
+
+
+Q: I get compiler errors in a line with u_int8_t or similar.
+A: Add -D_GNU_SOURCE to the compiler command line. See previous
+ question. This is a very questionable GNU extension. The C Standard
+ defines uint8_t, uint16_t and uint32_t. Use those instead.
+
+
+Q: Can I compile or use the diet libc with a compiler that is not gcc?
+A: Compile: no. Use: yes.
+
+
+Q: Can you please port the diet libc to FreeBSD/Solaris/Windows?
+A: No.
+
+
+Q: Why do you support non-embedded platforms like IA64 and x86_64?
+A: The diet libc is also useful for servers because it can improve
+ performance by an order of magnitude for certain programming models.
+ Please see http://www.fefe.de/fnord/ (in particular .../fnord/SPEED)
+ for an example and/or read http://www.fefe.de/talk.pdf for some
+ benchmarks.
diff --git a/mdk-stage1/dietlibc/Makefile b/mdk-stage1/dietlibc/Makefile
index b6e7b2783..ca28ec345 100644
--- a/mdk-stage1/dietlibc/Makefile
+++ b/mdk-stage1/dietlibc/Makefile
@@ -1,13 +1,96 @@
-ARCH=$(shell uname -m | sed 's/i[4-9]86/i386/')
+INSTALL=install
+prefix=/usr
+# Set the following to install to a different root
+#DESTDIR=/tmp/fefix
+# Use "make DEBUG=1" to compile a debug version.
+
+MYARCH:=$(shell uname -m | sed -e 's/i[4-9]86/i386/' -e 's/armv[3-6][lb]/arm/' -e 's/ppc64/ppc/')
+
+# This extra-ugly cruft is here so make will not run uname and sed each
+# time it looks at $(OBJDIR). This alone sped up running make when
+# nothing has to be done from 1 sec to 0.12 sec on a 900 MHz Athlon.
+# We don't use ARCH:=$(MYARCH) so we can detect unknown architectures.
+ifeq ($(MYARCH),i386)
+ARCH=i386
+else
+ifeq ($(MYARCH),mips)
+ARCH=mips
+else
+ifeq ($(MYARCH),alpha)
+ARCH=alpha
+else
+ifeq ($(MYARCH),ppc)
+ARCH=ppc
+else
+ifeq ($(MYARCH),arm)
+ARCH=arm
+else
+ifeq ($(MYARCH),sparc)
+ARCH=sparc
+else
+ifeq ($(MYARCH),sparc64)
+ARCH=sparc64
+else
+ifeq ($(MYARCH),s390)
+ARCH=s390
+else
+ifeq ($(MYARCH),mipsel)
+ARCH=mipsel
+else
+ifeq ($(MYARCH),parisc)
+ARCH=parisc
+else
+ifeq ($(MYARCH),x86_64)
+ARCH=x86_64
+else
+ifeq ($(MYARCH),ia64)
+ARCH=ia64
+else
+$(error unknown architecture, please fix Makefile)
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+endif
+
+# ARCH=$(MYARCH)
+
+LIBDIR=${prefix}/lib
+ifeq ($(ARCH),x86_64)
+LIBDIR=${prefix}/lib64
+endif
+BINDIR=${prefix}/bin
+MAN1DIR=${prefix}/share/man/man1
+INSTALLHOME=$(LIBDIR)/dietlibc
OBJDIR=bin-$(ARCH)
+ILIBDIR=$(INSTALLHOME)/lib-$(ARCH)
+
+HOME=$(shell pwd)
-all: $(OBJDIR) $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a $(OBJDIR)/liblatin1.a $(OBJDIR)/librpc.a $(OBJDIR)/diet
+WHAT= $(OBJDIR) $(OBJDIR)/start.o $(OBJDIR)/dyn_start.o $(OBJDIR)/dyn_stop.o \
+ $(OBJDIR)/dietlibc.a $(OBJDIR)/liblatin1.a \
+ $(OBJDIR)/libcompat.a $(OBJDIR)/libm.a \
+ $(OBJDIR)/librpc.a $(OBJDIR)/libpthread.a \
+ $(OBJDIR)/diet $(OBJDIR)/diet-i $(OBJDIR)/elftrunc
-CFLAGS=-pipe
+all: $(WHAT)
+
+profiling: $(OBJDIR)/libgmon.a $(OBJDIR)/pstart.o
+
+CFLAGS=-pipe -nostdinc
CROSS=
-VPATH=lib:libstdio:libugly:libcruft:libcrypt:libshell:liblatin1:librpc:libregex:syscalls.c
+CC=gcc
+
+VPATH=lib:libstdio:libugly:libcruft:libcrypt:libshell:liblatin1:libcompat:libdl:librpc:libregex:libm:profiling
SYSCALLOBJ=$(patsubst syscalls.s/%.S,$(OBJDIR)/%.o,$(wildcard syscalls.s/*.S))
@@ -17,13 +100,23 @@ LIBSTDIOOBJ=$(patsubst libstdio/%.c,$(OBJDIR)/%.o,$(wildcard libstdio/*.c))
LIBCRUFTOBJ=$(patsubst libcruft/%.c,$(OBJDIR)/%.o,$(wildcard libcruft/*.c))
LIBCRYPTOBJ=$(patsubst libcrypt/%.c,$(OBJDIR)/%.o,$(wildcard libcrypt/*.c))
LIBSHELLOBJ=$(patsubst libshell/%.c,$(OBJDIR)/%.o,$(wildcard libshell/*.c))
+LIBCOMPATOBJ=$(patsubst libcompat/%.c,$(OBJDIR)/%.o,$(wildcard libcompat/*.c)) $(OBJDIR)/syscall.o
+LIBMATH=$(patsubst libm/%.c,%.o,$(wildcard libm/*.c))
LIBRPCOBJ=$(patsubst librpc/%.c,$(OBJDIR)/%.o,$(wildcard librpc/*.c))
LIBREGEXOBJ=$(patsubst libregex/%.c,$(OBJDIR)/%.o,$(wildcard libregex/*.c))
+LIBDLOBJ=$(patsubst libdl/%.c,$(OBJDIR)/%.o,$(wildcard libdl/*.c)) $(OBJDIR)/_dl_jump.o
+
+LIBPTHREAD_OBJS=$(patsubst libpthread/%.c,$(OBJDIR)/%.o,$(shell ./threadsafe.sh)) $(OBJDIR)/__testandset.o
+
+LIBGMON_OBJS=$(OBJDIR)/__mcount.o $(OBJDIR)/monitor.o $(OBJDIR)/profil.o
+
include $(ARCH)/Makefile.add
-ifeq ($(CFLAGS),-pipe)
+LIBMATHOBJ=$(patsubst %,$(OBJDIR)/%,$(LIBMATH))
+
+ifeq ($(CFLAGS),-pipe -nostdinc)
CFLAGS+=-O -fomit-frame-pointer
endif
@@ -31,28 +124,39 @@ ifneq ($(DEBUG),)
CFLAGS = -g
COMMENT = :
endif
-CFLAGS += -Wall -Wno-switch
+CFLAGS += -Wall -W -Wchar-subscripts -Wmissing-prototypes -Wmissing-declarations -Wno-switch -Wredundant-decls -Wno-unused
PWD=$(shell pwd)
.SUFFIXES:
.SUFFIXES: .S .c
-$(OBJDIR):
+# added real dynamic dietlibc.so
+PICODIR = pic-$(ARCH)
+
+$(OBJDIR) $(PICODIR):
mkdir $@
% :: %,v
-$(OBJDIR)/%.o: %.S
+$(OBJDIR)/pstart.o: start.S
+ $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -DPROFILING -c $< -o $@
+
+$(OBJDIR)/%.o: %.S $(ARCH)/syscalls.h
+ $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< -o $@
+
+$(OBJDIR)/pthread_%.o: libpthread/pthread_%.c
$(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< -o $@
+ $(COMMENT) -$(CROSS)strip -x -R .comment -R .note $@
$(OBJDIR)/%.o: %.c
$(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< -o $@
- $(COMMENT) $(CROSS)strip -x -R .comment -R .note $@
+ $(COMMENT) -$(CROSS)strip -x -R .comment -R .note $@
-DIETLIBC_OBJ = $(SYSCALLOBJ) $(LIBOBJ) $(LIBSTDIOOBJ) $(LIBUGLYOBJ) \
+DIETLIBC_OBJ = $(OBJDIR)/unified.o \
+$(SYSCALLOBJ) $(LIBOBJ) $(LIBSTDIOOBJ) $(LIBUGLYOBJ) \
$(LIBCRUFTOBJ) $(LIBCRYPTOBJ) $(LIBSHELLOBJ) $(LIBREGEXOBJ) \
-$(OBJDIR)/__longjmp.o $(OBJDIR)/setjmp.o $(OBJDIR)/unified.o \
+$(OBJDIR)/__longjmp.o $(OBJDIR)/setjmp.o \
$(OBJDIR)/mmap.o $(OBJDIR)/clone.o
$(OBJDIR)/dietlibc.a: $(DIETLIBC_OBJ) $(OBJDIR)/start.o
@@ -65,67 +169,184 @@ LIBLATIN1_OBJS=$(patsubst liblatin1/%.c,$(OBJDIR)/%.o,$(wildcard liblatin1/*.c))
$(OBJDIR)/liblatin1.a: $(LIBLATIN1_OBJS)
$(CROSS)ar cru $@ $^
+$(OBJDIR)/libgmon.a: $(LIBGMON_OBJS)
+ $(CROSS)ar cru $@ $^
+
+$(OBJDIR)/libpthread.a: $(LIBPTHREAD_OBJS) dietfeatures.h
+ $(CROSS)ar cru $@ $(LIBPTHREAD_OBJS)
+
+$(OBJDIR)/libcompat.a: $(LIBCOMPATOBJ)
+ $(CROSS)ar cru $@ $(LIBCOMPATOBJ)
+
+$(OBJDIR)/libm.a: $(LIBMATHOBJ)
+ $(CROSS)ar cru $@ $(LIBMATHOBJ)
+
$(OBJDIR)/libdietc.so: $(OBJDIR)/dietlibc.a
$(CROSS)ld -whole-archive -shared -o $@ $^
+dyn: dyn_lib
+
+# added dynamic linker
+$(OBJDIR)/libdl.a: $(LIBDLOBJ)
+ $(CROSS)ar cru $@ $(LIBDLOBJ)
+
+dyn_lib: $(PICODIR) $(PICODIR)/libc.so $(PICODIR)/dstart.o \
+ $(PICODIR)/dyn_so_start.o $(PICODIR)/dyn_start.o $(PICODIR)/dyn_stop.o \
+ $(PICODIR)/libpthread.so $(PICODIR)/libdl.so $(PICODIR)/libcompat.so \
+ $(PICODIR)/diet-dyn $(PICODIR)/diet-dyn-i
+
+$(PICODIR)/%.o: %.S $(ARCH)/syscalls.h
+ $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -c $< -o $@
+
+$(PICODIR)/pthread_%.o: libpthread/pthread_%.c
+ $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -c $< -o $@
+ $(COMMENT) $(CROSS)strip -x -R .comment -R .note $@
+
+$(PICODIR)/%.o: %.c
+ $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -c $< -o $@
+ $(COMMENT) $(CROSS)strip -x -R .comment -R .note $@
+
+$(PICODIR)/dstart.o: start.S
+ $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -c $< -o $@
+
+$(PICODIR)/dyn_so_start.o: dyn_start.c
+ $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -fPIC -D__DYN_LIB -D__DYN_LIB_SHARED -c $< -o $@
+ $(COMMENT) $(CROSS)strip -x -R .comment -R .note $@
+
+DYN_LIBC_PIC = $(LIBOBJ) $(LIBSTDIOOBJ) $(LIBUGLYOBJ) \
+$(LIBCRUFTOBJ) $(LIBCRYPTOBJ) $(LIBSHELLOBJ) $(LIBREGEXOBJ)
+
+DYN_LIBC_OBJ = $(PICODIR)/dyn_syscalls.o $(PICODIR)/errlist.o \
+ $(patsubst $(OBJDIR)/%.o,$(PICODIR)/%.o,$(DYN_LIBC_PIC))
+
+DYN_PTHREAD_OBJS = $(patsubst $(OBJDIR)/%.o,$(PICODIR)/%.o,$(LIBPTHREAD_OBJS))
+
+DYN_LIBDL_OBJS = $(patsubst $(OBJDIR)/%.o,$(PICODIR)/%.o,$(LIBDLOBJ))
+
+DYN_LIBCOMPAT_OBJS = $(patsubst $(OBJDIR)/%.o,$(PICODIR)/%.o,$(LIBCOMPATOBJ))
+
+$(PICODIR)/libc.so: $(PICODIR) $(DYN_LIBC_OBJ)
+ $(CROSS)$(CC) -nostdlib -shared -o $@ $(CFLAGS) -fPIC $(DYN_LIBC_OBJ) -lgcc -Wl,-soname=libc.so
+
+$(PICODIR)/libpthread.so: $(DYN_PTHREAD_OBJS) dietfeatures.h
+ $(CROSS)$(CC) -nostdlib -shared -o $@ $(CFLAGS) -fPIC $(DYN_PTHREAD_OBJS) -L$(PICODIR) -lc -Wl,-soname=libpthread.so
+
+$(PICODIR)/libdl.so: libdl/_dl_main.c dietfeatures.h
+ $(CROSS)$(CC) -D__OD_CLEAN_ROOM -DNODIETREF -fPIC -nostdlib -shared -o $@ $(CFLAGS) -I. -Iinclude libdl/_dl_main.c -Wl,-soname=libdl.so
+
+#$(PICODIR)/libdl.so: $(DYN_LIBDL_OBJS) dietfeatures.h
+# $(CROSS)$(CC) -nostdlib -shared -o $@ $(CFLAGS) -fPIC $(DYN_LIBDL_OBJS) -L$(PICODIR) -ldietc -Wl,-soname=libdl.so
+
+$(PICODIR)/libcompat.so: $(DYN_LIBCOMPAT_OBJS) dietfeatures.h
+ $(CROSS)$(CC) -nostdlib -shared -o $@ $(CFLAGS) -fPIC $(DYN_LIBCOMPAT_OBJS) -L$(PICODIR) -lc -Wl,-soname=libcompat.so
+
+
+
$(SYSCALLOBJ): syscalls.h
-$(OBJDIR)/diet: diet.c $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a
- $(CROSS)$(CC) -Iinclude $(CFLAGS) -nostdlib -o $@ $^ -DDIETHOME=\"$(PWD)\"
+$(OBJDIR)/elftrunc: $(OBJDIR)/diet contrib/elftrunc.c
+ bin-$(MYARCH)/diet $(CROSS)$(CC) $(CFLAGS) -o $@ contrib/elftrunc.c
+
+VERSION=dietlibc-$(shell head -1 CHANGES|sed 's/://')
+CURNAME=$(notdir $(shell pwd))
+
+$(OBJDIR)/diet: $(OBJDIR)/start.o $(OBJDIR)/dyn_start.o diet.c $(OBJDIR)/dietlibc.a $(OBJDIR)/dyn_stop.o
+ $(CROSS)$(CC) -Iinclude $(CFLAGS) -nostdlib -o $@ $^ -DDIETHOME=\"$(HOME)\" -DVERSION=\"$(VERSION)\" -lgcc
+ $(CROSS)strip -R .comment -R .note $@
+
+$(OBJDIR)/diet-i: $(OBJDIR)/start.o $(OBJDIR)/dyn_start.o diet.c $(OBJDIR)/dietlibc.a $(OBJDIR)/dyn_stop.o
+ $(CROSS)$(CC) -Iinclude $(CFLAGS) -nostdlib -o $@ $^ -DDIETHOME=\"$(INSTALLHOME)\" -DVERSION=\"$(VERSION)\" -DINSTALLVERSION -lgcc
$(CROSS)strip -R .comment -R .note $@
+$(PICODIR)/diet-dyn: $(PICODIR)/start.o $(PICODIR)/dyn_start.o diet.c
+ $(CROSS)$(CC) -Iinclude $(CFLAGS) -fPIC -nostdlib -o $@ $^ -DDIETHOME=\"$(HOME)\" -D__DYN_LIB -DVERSION=\"$(VERSION)\" -L$(PICODIR) -lc -lgcc $(PICODIR)/dyn_stop.o -Wl,-dynamic-linker=$(HOME)/$(PICODIR)/libdl.so
+ $(CROSS)strip -R .command -R .note $@
+
+$(PICODIR)/diet-dyn-i: $(PICODIR)/start.o $(PICODIR)/dyn_start.o diet.c
+ $(CROSS)$(CC) -Iinclude $(CFLAGS) -fPIC -nostdlib -o $@ $^ -DDIETHOME=\"$(prefix)\" -D__DYN_LIB -DVERSION=\"$(VERSION)\" -L$(PICODIR) -lc -lgcc $(PICODIR)/dyn_stop.o -Wl,-dynamic-linker=$(ILIBDIR)/libdl.so -DINSTALLVERSION
+ $(CROSS)strip -R .command -R .note $@
+
$(OBJDIR)/djb: $(OBJDIR)/compile $(OBJDIR)/load
$(OBJDIR)/compile:
- echo 'exec gcc $(CFLAGS) -I$(PWD)/$(OBJDIR)/include -c $${1+"$$@"}' > $@
+ echo 'exec' $(CC) '$(CFLAGS) -I$(PWD)/$(OBJDIR)/include -c $${1+"$$@"}' > $@
chmod 755 $@
$(OBJDIR)/load:
- echo 'main="$$1"; shift; exec gcc -nostdlib -o "$$main" $(PWD)/$(OBJDIR)/start.o "$$main".o $${1+"$$@"} $(PWD)/$(OBJDIR)/dietlibc.a -lgcc' > $@
+ echo 'main="$$1"; shift; exec' $(CC) '-nostdlib -o "$$main" $(PWD)/$(OBJDIR)/start.o "$$main".o $${1+"$$@"} $(PWD)/$(OBJDIR)/dietlibc.a -lgcc' > $@
chmod 755 $@
clean:
- rm -f *.o *.a t t1 compile load exports mapfile libdietc.so
- rm -rf bin-*
+ rm -f *.o *.a t t1 compile load elftrunc exports mapfile libdietc.so
+ rm -rf bin-* pic-*
+ $(MAKE) -C examples clean
+ $(MAKE) -C dynlinker clean
+ $(MAKE) -C libdl clean
-tar: clean
- rm -f armv4l
- ln -sf arm armv4l
- cd ..; tar cvvf dietlibc.tar.bz2 dietlibc --use=bzip2 --exclude CVS
+tar: clean rename
+ cd ..; tar cvvf $(VERSION).tar.bz2 $(VERSION) --use=bzip2 --exclude CVS
+
+rename:
+ if test $(CURNAME) != $(VERSION); then cd .. && mv $(CURNAME) $(VERSION); fi
$(OBJDIR)/exports: $(OBJDIR)/dietlibc.a
nm -g $(OBJDIR)/dietlibc.a | grep -w T | awk '{ print $$3 }' | sort -u > $(OBJDIR)/exports
.PHONY: t t1
t:
- $(CROSS)$(CC) -g $(CFLAGS) -fno-builtin -nostdlib -Iinclude -o t t.c $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a -lgcc -Wl,-Map,mapfile
+ $(CROSS)$(CC) -g $(CFLAGS) -fno-builtin -nostdlib -Iinclude -o t t.c $(OBJDIR)/start.o $(OBJDIR)/dyn_start.o $(OBJDIR)/dietlibc.a -lgcc $(OBJDIR)/dyn_stop.o -Wl,-Map,mapfile
t1:
$(CROSS)$(CC) -g -o t1 t.c
-install: $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a $(OBJDIR)/liblatin1.a $(OBJDIR)/diet
- cp $(OBJDIR)/start.o $(INSTALLPREFIX)$(prefix)/lib/dietstart.o
- cp $(OBJDIR)/dietlibc.a $(INSTALLPREFIX)$(prefix)/lib/libdietc.a
- cp $(OBJDIR)/liblatin1.a $(INSTALLPREFIX)$(prefix)/lib/libdietlatin1.a
- cp $(OBJDIR)/diet $(INSTALLPREFIX)$(prefix)/bin/diet
-
-.PHONY: sparc ppc mips arm alpha i386
-
-arm sparc ppc alpha i386:
- $(MAKE) ARCH=$@ CROSS=$@-linux- all t bin-$@/libdietc.so
-
-mips:
- $(MAKE) ARCH=$@ CROSS=$@-linux-gnu- all t bin-$@/libdietc.so
+install: $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a $(OBJDIR)/librpc.a $(OBJDIR)/liblatin1.a $(OBJDIR)/libcompat.a $(OBJDIR)/elftrunc $(OBJDIR)/diet-i
+ $(INSTALL) -d $(DESTDIR)$(ILIBDIR) $(DESTDIR)$(MAN1DIR) $(DESTDIR)$(BINDIR)
+ $(INSTALL) $(OBJDIR)/start.o $(DESTDIR)$(ILIBDIR)/start.o
+ $(INSTALL) -m 644 $(OBJDIR)/libm.a $(OBJDIR)/libpthread.a $(OBJDIR)/librpc.a \
+$(OBJDIR)/liblatin1.a $(OBJDIR)/libcompat.a $(DESTDIR)$(ILIBDIR)
+ $(INSTALL) -m 644 $(OBJDIR)/dietlibc.a $(DESTDIR)$(ILIBDIR)/libc.a
+ifeq ($(MYARCH),$(ARCH))
+ $(INSTALL) $(OBJDIR)/diet-i $(DESTDIR)$(BINDIR)/diet
+ -$(INSTALL) $(PICODIR)/diet-dyn-i $(DESTDIR)$(BINDIR)/diet-dyn
+endif
+ -$(INSTALL) $(OBJDIR)/pstart.o $(OBJDIR)/libgmon.a $(OBJDIR)/dyn_start.o $(OBJDIR)/dyn_stop.o $(DESTDIR)$(ILIBDIR)
+ -$(INSTALL) $(PICODIR)/libc.so $(DESTDIR)$(ILIBDIR)/libc.so
+ -$(INSTALL) $(PICODIR)/libpthread.so $(DESTDIR)$(ILIBDIR)/libpthread.so
+ -$(INSTALL) $(PICODIR)/libdl.so $(DESTDIR)$(ILIBDIR)/libdl.so
+ -$(INSTALL) $(PICODIR)/libcompat.so $(DESTDIR)$(ILIBDIR)/libcompat.so
+ -$(INSTALL) $(PICODIR)/dyn_start.o $(DESTDIR)$(ILIBDIR)/dyn_dstart.o
+ -$(INSTALL) $(PICODIR)/dyn_stop.o $(DESTDIR)$(ILIBDIR)/dyn_dstop.o
+ -$(INSTALL) $(PICODIR)/dstart.o $(PICODIR)/dyn_so_start.o $(DESTDIR)$(ILIBDIR)
+ $(INSTALL) -m 644 diet.1 $(DESTDIR)$(MAN1DIR)/diet.1
+ if test -f $(PICODIR)/libc.so -a ! -f $(DESTDIR)/etc/diet.ld.conf; then echo "$(ILIBDIR)" > $(DESTDIR)/etc/diet.ld.conf; fi
+ for i in `find include -name \*.h`; do install -m 644 -D $$i $(DESTDIR)$(INSTALLHOME)/$$i; done
+
+.PHONY: sparc ppc mips arm alpha i386 parisc mipsel powerpc s390 sparc64
+.PHONY: x86_64 ia64
+
+arm sparc ppc alpha i386 mips parisc s390 sparc64 x86_64 ia64:
+ $(MAKE) ARCH=$@ CROSS=$@-linux- all
+
+# Cross compile for little endian MIPS
+mipsel:
+ $(MAKE) ARCH=$@ CROSS=mips-linux- all
+
+mips-gnu:
+ $(MAKE) ARCH=$@ CROSS=$@-linux-gnu- all
+
+# Some people named their cross compiler toolchain powerpc-linux-gcc
+powerpc:
+ $(MAKE) ARCH=ppc CROSS=powerpc-linux- all
cross:
- $(MAKE) arm sparc ppc alpha i386 mips
+ $(MAKE) arm sparc ppc alpha i386 mips sparc64
# these depend on dietfeatures.h for large file backward compatibility
-$(OBJDIR)/__fstat64.o $(OBJDIR)/__lstat64.o $(OBJDIR)/__stat64.o: dietfeatures.h
+$(OBJDIR)/__fstat64.o $(OBJDIR)/__lstat64.o $(OBJDIR)/__stat64.o $(OBJDIR)/lseek64.o $(OBJDIR)/readdir64.o $(OBJDIR)/stat64.o $(OBJDIR)/lstat64.o $(OBJDIR)/fstat64.o $(OBJDIR)/truncate64.o $(OBJDIR)/__truncate64.o $(OBJDIR)/ftruncate64.o $(OBJDIR)/__ftruncate64.o $(PICODIR)/dyn_syscalls.o $(PICODIR)/__truncate64.o $(PICODIR)/__ftruncate64.o $(PICODIR)/__stat64.o $(PICODIR)/__lstat64.o $(PICODIR)/__fstat64.o: dietfeatures.h
# these depend on dietfeatures.h for thread support
-$(OBJDIR)/alloc.o $(OBJDIR)/perror.o $(OBJDIR)/logging.o $(OBJDIR)/unified.o: dietfeatures.h
+$(OBJDIR)/alloc.o $(OBJDIR)/perror.o $(OBJDIR)/logging.o $(OBJDIR)/unified.o $(OBJDIR)/clone.o $(OBJDIR)/set_errno.o: dietfeatures.h
# these depend on dietfeatures.h for linker warnings
$(OBJDIR)/assert_fail.o $(OBJDIR)/sprintf.o $(OBJDIR)/vsnprintf.o $(OBJDIR)/___div.o $(OBJDIR)/fflush.o $(OBJDIR)/setvbuf.o $(OBJDIR)/system.o $(OBJDIR)/sendfile.o $(OBJDIR)/setenv.o: dietfeatures.h
@@ -137,10 +358,56 @@ fclose.o $(OBJDIR)/fdglue.o $(OBJDIR)/fflush.o $(OBJDIR)/fgetc.o $(OBJDIR)/fputc
strcasecmp.o $(OBJDIR)/strcat.o $(OBJDIR)/strchr.o $(OBJDIR)/strcmp.o $(OBJDIR)/strcpy.o $(OBJDIR)/strlen.o $(OBJDIR)/strncasecmp.o $(OBJDIR)/strncat.o $(OBJDIR)/strrchr.o: dietfeatures.h
# these depend on dietfeatures.h for /proc
-$(OBJDIR)/tty.o: dietfeatures.h
-
-# these depend on dietfeatures.h for ungetc support ;-)
-$(OBJDIR)/ungetc.o: dietfeatures.h
+$(OBJDIR)/ttyname.o $(OBJDIR)/sysconf_cpus.o: dietfeatures.h
# these depend on dietfeatures.h for WANT_TZFILE_PARSER
$(OBJDIR)/localtime_r.o: dietfeatures.h
+
+# these depend on dietfeatures.h for WANT_SMALL_STDIO_BUFS
+$(LIBSTDIOOBJ): dietfeatures.h
+
+# these depend on dietfeatures.h for WANT_FULL_RESOLV_CONF
+$(OBJDIR)/dnscruft.o $(OBJDIR)/dnscruft2.o: dietfeatures.h
+
+# these depend on dietfeatures.h for WANT_THREAD_SAFE and errno
+$(LIBRPCOBJ) $(OBJDIR)/logging.o $(OBJDIR)/alloc.o $(OBJDIR)/cfsetospeed.o $(OBJDIR)/cfsetispeed.o \
+$(OBJDIR)/execl.o $(OBJDIR)/execlp.o $(OBJDIR)/execv.o $(OBJDIR)/execvp.o $(OBJDIR)/isatty.o \
+$(OBJDIR)/lockf.o $(OBJDIR)/perror.o $(OBJDIR)/remove.o $(OBJDIR)/set_errno.o $(OBJDIR)/sigemptyset.o \
+$(OBJDIR)/tcsetattr.o $(OBJDIR)/dnscruft2.o $(OBJDIR)/dnscruft.o $(OBJDIR)/entlib.o \
+$(OBJDIR)/gethostbyaddr.o $(OBJDIR)/gethostbyaddr_r.o $(OBJDIR)/gethostbyname.o \
+$(OBJDIR)/gethostbyname_r.o $(OBJDIR)/gethostbyname2.o $(OBJDIR)/gethostbyname2_r.o \
+$(OBJDIR)/inet_pton.o $(OBJDIR)/mkstemp.o $(OBJDIR)/mktemp.o $(OBJDIR)/tempnam.o \
+$(OBJDIR)/glob.o $(OBJDIR)/realpath.o $(OBJDIR)/fdglue.o $(OBJDIR)/fdglue2.o \
+$(OBJDIR)/getaddrinfo.o $(OBJDIR)/getnameinfo.o $(OBJDIR)/getprotoent.o \
+$(OBJDIR)/getservent.o $(OBJDIR)/iconv.o $(OBJDIR)/iconv_open.o \
+$(OBJDIR)/netent.o $(OBJDIR)/system.o $(OBJDIR)/stdin.o $(OBJDIR)/stdout.o \
+$(OBJDIR)/stderr.o: dietfeatures.h
+
+# these depend on dietfeatures.h for WANT_CRYPT_MD5
+$(OBJDIR)/crypt.o: dietfeatures.h
+
+# these depend on dietfeatures.h for WANT_FREAD_OPTIMIZATION
+$(OBJDIR)/fread.o $(OBJDIR)/fwrite.o: dietfeatures.h
+
+# these depend on dietfeatures.h for WANT_DYNAMIC
+$(OBJDIR)/start.o $(OBJDIR)/dyn_start.o $(OBJDIR)/dyn_stop.o: dietfeatures.h
+
+$(OBJDIR)/unified.o: dietuglyweaks.h
+
+$(OBJDIR)/adjtimex.o: include/sys/timex.h
+
+$(OBJDIR)/fgetc_unlocked.o $(OBJDIR)/fread.o $(OBJDIR)/ungetc.o: dietstdio.h
+
+# these depend on dietfeatures.h for WANT_LINKER_WARNINGS
+$(OBJDIR)/setlinebuf.o $(OBJDIR)/bzero.o $(OBJDIR)/setegid.o \
+$(OBJDIR)/seteuid.o: dietfeatures.h
+
+# these depend on dietfeatures.h for WANT_FULL_POSIX_COMPAT
+$(OBJDIR)/strncpy.o: dietfeatures.h
+$(OBJDIR)/strxfrm.o: dietfeatures.h
+
+# these depend on dietfeatures.h for WANT_INET_ADDR_DNS
+$(OBJDIR)/gethostbyname_r.o: dietfeatures.h
+
+
+# CFLAGS+=-W -Wshadow -Wid-clash-31 -Wpointer-arith -Wcast-align -Wstrict-prototypes -Wwrite-strings
diff --git a/mdk-stage1/dietlibc/PORTING b/mdk-stage1/dietlibc/PORTING
new file mode 100644
index 000000000..4e2a6358c
--- /dev/null
+++ b/mdk-stage1/dietlibc/PORTING
@@ -0,0 +1,28 @@
+To port the diet libc to a new architecture, you need to:
+
+ - edit Makefile to detect the architecture
+ - create a directory for the architecture, and put a Makefile.add in
+ it. Look at the other Makefile.adds for guidance.
+ - provide start.S (the start code, look at glibc)
+ - provide unified.S (the unified syscall)
+ - provide syscalls.h (the syscall numbers, from asm/unistd.h)
+ - provide setjmp and longjmp
+ - edit include/setjmp.h
+ - pipe, clone and mmap often need special care
+ - edit include/sys/ioctl.h
+ - edit include/sys/ptrace.h
+ - edit include/asm/sigcontext.h
+ - edit include/sys/ucontext.h
+ - edit include/endian.h
+ - edit include/fcntl.h
+ - edit include/sys/mman.h
+ - edit include/sys/shm.h
+ - edit include/sys/stat.h
+ - edit include/errno.h
+ - edit syscalls.h
+ - edit include/termios.h
+ - edit diet.c to make it recognize the architecture and add proper
+ CFLAGS
+ - edit libcompat/syscall.S
+
+(I may have missed a few)
diff --git a/mdk-stage1/dietlibc/README b/mdk-stage1/dietlibc/README
index ce9838832..2a1fa332c 100644
--- a/mdk-stage1/dietlibc/README
+++ b/mdk-stage1/dietlibc/README
@@ -1,3 +1,8 @@
+ The system library is a challenge to all those using the computer to
+ write their own faster and better routines or to bow to the superior
+ strength and skill of a true master.
+ --http://www.inner.net/users/cmetz/program-like-a-klingon
+
diet libc to statically link programs that don't need all the bloat
from glibc.
@@ -7,10 +12,7 @@ To compile:
$ make
-make should compile the diet libc itself without warnings. In addition
-to the diet libc, the default make target includes t, which is a test
-program and probably contains code which produces warnings. You can
-safely ignore them.
+make should compile the diet libc itself.
When make is done, it will have created dietlibc.a in bin-i386 (or
bin-ppc, bin-alpha, bin-sparc, bin-ppc or bin-arm, depending on your
@@ -41,3 +43,7 @@ The embedded utils are small replacements for common utilities like mv,
chown, ls, and even a small tar that can extract tar files. The binary
repository contains a few utilities I linked against the diet libc, for
example gzip, bzip2 and fdisk.
+
+
+The license for the diet libc is the GNU General Public License, version
+2 (as included in the file COPYING).
diff --git a/mdk-stage1/dietlibc/SECURITY b/mdk-stage1/dietlibc/SECURITY
new file mode 100644
index 000000000..67debc6e7
--- /dev/null
+++ b/mdk-stage1/dietlibc/SECURITY
@@ -0,0 +1,13 @@
+The diet libc was written with small code and embedded devices in mind,
+not with security for network servers.
+
+Of course we still try to avoid buffer overflows, but there are some
+parts of the code where tradeoffs have been made. This file is meant to
+document them.
+
+ 1. The DNS routines do not check whether the answer came from the IP
+ of the DNS server. The rationale is that people who can sniff the
+ network to find out the query, source port and DNS sequence number
+ can also spoof DNS packets to appear to come from the server we
+ asked, so it does not actually increase security to have that
+ check.
diff --git a/mdk-stage1/dietlibc/THANKS b/mdk-stage1/dietlibc/THANKS
new file mode 100644
index 000000000..cda9400b6
--- /dev/null
+++ b/mdk-stage1/dietlibc/THANKS
@@ -0,0 +1,31 @@
+The malloc code was done by Olaf Dreesen, who also helped with the SPARC
+start code and fork(). Olaf also did the printf and scanf routines and
+he implemented pthreads (wow!) and his now writing a dynamic linker, and
+he ported the diet libc to S/390.
+
+Thomas Ogrisegg ported the diet libc to PA-RISC and IA64 and fixed a few things.
+
+I initially took some syscalls from Redhat minilibc, but the code has
+been completely replaced now.
+
+I initially took localtime and the directory reading routines from
+uClibc, but the code has been completely replaced now.
+
+syslog and crypt were contributed by René Müller.
+
+Jeff Garzik contributed {get,set}{pw,gr,sp}ent.
+
+Uwe Ohse went through the code and fixed many bugs.
+
+Frank Klemm contributed the math library and a lot of correctness and
+smallness patches and rewrote many functions in ix86 assembly language.
+
+Erik Troan found several important bugs and sent in patches to fix them.
+
+I also grabbed code from glibc (mostly assembly routines), and looked at
+the OpenBSD libc for inspiration.
+
+Michal Ludvig did the porting to x86_64 and Gwenole Beauchesne helped
+finish the port.
+
+Johannes Stezenbach improved the MIPS port.
diff --git a/mdk-stage1/dietlibc/TODO b/mdk-stage1/dietlibc/TODO
new file mode 100644
index 000000000..3e323ad44
--- /dev/null
+++ b/mdk-stage1/dietlibc/TODO
@@ -0,0 +1,26 @@
+ - "locale"
+ - real regerror
+ - improve code size and quality with __restrict__.
+ - FPU exception handling (for mawk)
+ - res_mkquery should not assume op is QUERY
+ - syslog
+ - gethost/netent -> parselib?
+ - Look at qsort (the make test suite exhibits the worst case)
+ - Make __dtostr do scientific notation.
+ - fix %g in printf. They are more or less completely b0rken (in
+ particular rounding the last digit does not work).
+ - qmail-queue dumps core since we added vfork. Editing fork.h to #define
+ vfork to fork works. What happens here?
+ - use TCP if buf[2]&2 is non-zero in DNS answers.
+ - look at mktime: "Falls tm_isdst == -1 gesetzt, so sollte mktime
+ versuchen herauszufinden, ob Sommerzeit eingestellt ist (und laut linux
+ manpage auch tzname setzen), ansonsten die angegebene DST
+ berücksichtigen."
+ - better rand()?
+ - try to make zebra compile.
+ - printf %e
+ - move DNS stuff to libresolv.a?
+ - x86_64: readdir fails their test (Gwenole Beauchesne)
+ - regular expressions standards compliance; test suite from AT&T
+ - fgetpwent (needed for cvm)
+ - investigate putting some libgcc symbols in dietlibc.so for gcc<3
diff --git a/mdk-stage1/dietlibc/alpha/Makefile.add b/mdk-stage1/dietlibc/alpha/Makefile.add
index 10ff0faef..68b10b43c 100644
--- a/mdk-stage1/dietlibc/alpha/Makefile.add
+++ b/mdk-stage1/dietlibc/alpha/Makefile.add
@@ -2,4 +2,4 @@
CFLAGS+=-Os -Iinclude -fomit-frame-pointer -fstrict-aliasing
VPATH:=alpha:syscalls.s:$(VPATH)
-LIBOBJ+=$(patsubst %,$(OBJDIR)/%,divq.o divl.o remq.o reml.o seteuid.o __time.o)
+LIBOBJ+=$(patsubst %,$(OBJDIR)/%,divq.o divl.o remq.o reml.o __time.o __alarm.o)
diff --git a/mdk-stage1/dietlibc/alpha/__alarm.c b/mdk-stage1/dietlibc/alpha/__alarm.c
new file mode 100644
index 000000000..7ca35cb78
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/__alarm.c
@@ -0,0 +1,13 @@
+#include <unistd.h>
+#include <sys/time.h>
+
+unsigned int alarm(unsigned int seconds) {
+ struct itimerval old, new;
+ unsigned int ret;
+ new.it_interval.tv_usec=0;
+ new.it_interval.tv_sec=0;
+ new.it_value.tv_usec =0;
+ new.it_value.tv_sec =(long)seconds;
+ if (setitimer(ITIMER_REAL,&new,&old)==-1) return 0;
+ return old.it_value.tv_sec+(old.it_value.tv_usec?1:0);
+}
diff --git a/mdk-stage1/dietlibc/alpha/__longjmp.S b/mdk-stage1/dietlibc/alpha/__longjmp.S
index d86d76717..31e374d0f 100644
--- a/mdk-stage1/dietlibc/alpha/__longjmp.S
+++ b/mdk-stage1/dietlibc/alpha/__longjmp.S
@@ -1,11 +1,10 @@
-#ifdef __alpha__
-
#include <setjmp.h>
.text
.align 2
.global __longjmp
+.type __longjmp,@function
__longjmp:
mov $17, $0 /* a1 -> v0 */
@@ -18,7 +17,7 @@ __longjmp:
ldq $26, (JB_PC*8) ($16) /* ra */
ldq $fp, (JB_FP*8) ($16) /* fp */
- ldq $1, (JB_SP*8) ($16) /* sp */
+ ldq $sp, (JB_SP*8) ($16) /* sp */
ldt $f2, (JB_F2*8) ($16) /* f2 */
ldt $f3, (JB_F3*8) ($16) /* f3 */
@@ -30,9 +29,5 @@ __longjmp:
ldt $f9, (JB_F9*8) ($16) /* f9 */
cmoveq $0, 0x1, $0
- mov $1, $sp
ret $31, ($26), 1
-
-
-#endif
diff --git a/mdk-stage1/dietlibc/alpha/__testandset.S b/mdk-stage1/dietlibc/alpha/__testandset.S
new file mode 100644
index 000000000..c5ef81241
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/__testandset.S
@@ -0,0 +1,11 @@
+.text
+.align 2
+.global __testandsets
+.type __testandsets,@function
+__testandset:
+ ldq_l $0, 0($16) /* load lock */
+ bne $0,1f /* ok there is a lock... */
+ lda $0, 1($31) /* load a 1 to register 0 */
+ stq_c $0, 0($16) /* write lock is locked :) */
+ beq $0,__testandset /* oops someone changed MY lock */
+1: ret $31, ($26), 0x01 /* return */
diff --git a/mdk-stage1/dietlibc/alpha/clone.S b/mdk-stage1/dietlibc/alpha/clone.S
index b7e32d707..28e61a8bc 100644
--- a/mdk-stage1/dietlibc/alpha/clone.S
+++ b/mdk-stage1/dietlibc/alpha/clone.S
@@ -1,5 +1,5 @@
#include "syscalls.h"
-#include <asm/errno.h>
+#include <errno.h>
.text
.align 2
diff --git a/mdk-stage1/dietlibc/alpha/lseek64.S b/mdk-stage1/dietlibc/alpha/lseek64.S
new file mode 100644
index 000000000..f051e734d
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/lseek64.S
@@ -0,0 +1,5 @@
+#include "syscalls.h"
+
+.global lseek64
+lseek64:
+ br lseek
diff --git a/mdk-stage1/dietlibc/alpha/n_sigprocmask.S b/mdk-stage1/dietlibc/alpha/n_sigprocmask.S
new file mode 100644
index 000000000..55f9fde28
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/n_sigprocmask.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall_weak(osf_sigprocmask,__old_sigprocmask,__n_sigprocmask)
diff --git a/mdk-stage1/dietlibc/alpha/setjmp.S b/mdk-stage1/dietlibc/alpha/setjmp.S
index 3768056be..04bfd3d94 100644
--- a/mdk-stage1/dietlibc/alpha/setjmp.S
+++ b/mdk-stage1/dietlibc/alpha/setjmp.S
@@ -1,15 +1,16 @@
#include <setjmp.h>
.text
+.weak setjmp
+.type setjmp,@function
+setjmp:
+.weak __setjmp
+.type __setjmp,@function
+__setjmp:
+ mov 0, $17
.global __sigsetjmp
+.type __sigsetjmp,@function
__sigsetjmp:
- ldgp $gp, 0($gp)
-
- mov $sp, $1
- lda $sp, -16($sp)
-
- stq $26, 0($sp) /* save ra */
-
stq $9, (JB_S0*8) ($16) /* s0 */
stq $10, (JB_S1*8) ($16) /* s1 */
stq $11, (JB_S2*8) ($16) /* s2 */
@@ -19,7 +20,7 @@ __sigsetjmp:
stq $26, (JB_PC*8) ($16) /* ra */
stq $fp, (JB_FP*8) ($16) /* fp */
- stq $1, (JB_SP*8) ($16) /* sp */
+ stq $sp, (JB_SP*8) ($16) /* sp */
stt $f2, (JB_F2*8) ($16) /* f2 */
stt $f3, (JB_F3*8) ($16) /* f3 */
@@ -30,17 +31,5 @@ __sigsetjmp:
stt $f8, (JB_F8*8) ($16) /* f8 */
stt $f9, (JB_F9*8) ($16) /* f9 */
- br $26, __sigjmp_save /* call __sigjmp_save */
+ br $31, __sigjmp_save /* jmp __sigjmp_save */
- ldq $26, 0($sp) /* restore ra */
-
- lda $sp, 16($sp)
- ret $31, ($26), 1 /* back to caller */
-
-.weak setjmp
-setjmp:
-.weak __setjmp
-__setjmp:
- ldgp $gp, 0($gp)
- mov 0, $17
- br __sigsetjmp
diff --git a/mdk-stage1/dietlibc/alpha/sigaction.c b/mdk-stage1/dietlibc/alpha/sigaction.c
new file mode 100644
index 000000000..f6c3ada7d
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/sigaction.c
@@ -0,0 +1,7 @@
+#include <signal.h>
+
+int __rt_sigaction(int signum, const struct sigaction *act, struct sigaction *oldact, long nr, void* restorer);
+
+int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) {
+ return __rt_sigaction(signum, act, oldact, _NSIG/8, 0);
+}
diff --git a/mdk-stage1/dietlibc/alpha/signal.S b/mdk-stage1/dietlibc/alpha/signal.S
deleted file mode 100644
index ceca0f02d..000000000
--- a/mdk-stage1/dietlibc/alpha/signal.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall(osf_signal,signal)
diff --git a/mdk-stage1/dietlibc/alpha/sigprocmask.S b/mdk-stage1/dietlibc/alpha/sigprocmask.S
deleted file mode 100644
index d9da836c2..000000000
--- a/mdk-stage1/dietlibc/alpha/sigprocmask.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "syscalls.h"
-
-syscall_weak(osf_sigprocmask,sigprocmask,__sigprocmask)
diff --git a/mdk-stage1/dietlibc/alpha/socketpair.S b/mdk-stage1/dietlibc/alpha/socketpair.S
new file mode 100644
index 000000000..06956a7ce
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/socketpair.S
@@ -0,0 +1,3 @@
+#include "syscalls.h"
+
+syscall(socketpair,socketpair)
diff --git a/mdk-stage1/dietlibc/alpha/start.S b/mdk-stage1/dietlibc/alpha/start.S
index 00b8e950d..850ce2420 100644
--- a/mdk-stage1/dietlibc/alpha/start.S
+++ b/mdk-stage1/dietlibc/alpha/start.S
@@ -1,7 +1,3 @@
-#include "start.h"
-
-#ifdef __alpha__
-
.text
.align 2
.set noreorder
@@ -17,19 +13,21 @@ _start:
ldgp $gp, 0($gp)
/* prepare to call main */
- ldl $16, 0($sp) /* argc */
+ ldl $16, 0($sp) /* argc / a0 */
- lda $17, 8($sp) /* argv */
+ lda $17, 8($sp) /* argv / a1 */
- addq $16, 1, $18 /* argp */
+ addq $16, 1, $18 /* argp / a2 */
s8addq $18, $17, $18 /* (8*(argc+1))+argv -> argp */
stq $18, environ
- mov $0, $21 /* mov v0(dynload) to a5 */
-
+#ifdef WANT_DYNAMIC
+/* in v0 ($0) is the ld.so _fini pointer */
+ mov $0, $19 /* mov v0(dynload) to a3 */
+ jsr $26, dyn_start
+#else
jsr $26, main
+#endif
mov $0, $16
jsr $26, exit /* YES, CALL! for threads and atexit ! (+4 byte) */
-
-#endif
diff --git a/mdk-stage1/dietlibc/alpha/syscalls.h b/mdk-stage1/dietlibc/alpha/syscalls.h
new file mode 100644
index 000000000..5c654b4bf
--- /dev/null
+++ b/mdk-stage1/dietlibc/alpha/syscalls.h
@@ -0,0 +1,371 @@
+
+#define __NR_osf_syscall 0 /* not implemented */
+#define __NR_exit 1
+#define __NR_fork 2
+#define __NR_read 3
+#define __NR_write 4
+#define __NR_osf_old_open 5 /* not implemented */
+#define __NR_close 6
+#define __NR_osf_wait4 7
+#define __NR_osf_old_creat 8 /* not implemented */
+#define __NR_link 9
+#define __NR_unlink 10
+#define __NR_osf_execve 11 /* not implemented */
+#define __NR_chdir 12
+#define __NR_fchdir 13
+#define __NR_mknod 14
+#define __NR_chmod 15
+#define __NR_chown 16
+#define __NR_brk 17
+#define __NR_osf_getfsstat 18 /* not implemented */
+#define __NR_lseek 19
+#define __NR_getxpid 20
+#define __NR_osf_mount 21
+#define __NR_umount 22
+#define __NR_setuid 23
+#define __NR_getxuid 24
+#define __NR_exec_with_loader 25 /* not implemented */
+#define __NR_ptrace 26
+#define __NR_osf_nrecvmsg 27 /* not implemented */
+#define __NR_osf_nsendmsg 28 /* not implemented */
+#define __NR_osf_nrecvfrom 29 /* not implemented */
+#define __NR_osf_naccept 30 /* not implemented */
+#define __NR_osf_ngetpeername 31 /* not implemented */
+#define __NR_osf_ngetsockname 32 /* not implemented */
+#define __NR_access 33
+#define __NR_osf_chflags 34 /* not implemented */
+#define __NR_osf_fchflags 35 /* not implemented */
+#define __NR_sync 36
+#define __NR_kill 37
+#define __NR_osf_old_stat 38 /* not implemented */
+#define __NR_setpgid 39
+#define __NR_osf_old_lstat 40 /* not implemented */
+#define __NR_dup 41
+#define __NR_pipe 42
+#define __NR_osf_set_program_attributes 43
+#define __NR_osf_profil 44 /* not implemented */
+#define __NR_open 45
+#define __NR_osf_old_sigaction 46 /* not implemented */
+#define __NR_getxgid 47
+#define __NR_osf_sigprocmask 48
+#define __NR_osf_getlogin 49 /* not implemented */
+#define __NR_osf_setlogin 50 /* not implemented */
+#define __NR_acct 51
+#define __NR_sigpending 52
+
+#define __NR_ioctl 54
+#define __NR_osf_reboot 55 /* not implemented */
+#define __NR_osf_revoke 56 /* not implemented */
+#define __NR_symlink 57
+#define __NR_readlink 58
+#define __NR_execve 59
+#define __NR_umask 60
+#define __NR_chroot 61
+#define __NR_osf_old_fstat 62 /* not implemented */
+#define __NR_getpgrp 63
+#define __NR_getpagesize 64
+#define __NR_osf_mremap 65 /* not implemented */
+#define __NR_vfork 66
+#define __NR_stat 67
+#define __NR_lstat 68
+#define __NR_osf_sbrk 69 /* not implemented */
+#define __NR_osf_sstk 70 /* not implemented */
+#define __NR_mmap 71 /* OSF/1 mmap is superset of Linux */
+#define __NR_osf_old_vadvise 72 /* not implemented */
+#define __NR_munmap 73
+#define __NR_mprotect 74
+#define __NR_madvise 75
+#define __NR_vhangup 76
+#define __NR_osf_kmodcall 77 /* not implemented */
+#define __NR_osf_mincore 78 /* not implemented */
+#define __NR_getgroups 79
+#define __NR_setgroups 80
+#define __NR_osf_old_getpgrp 81 /* not implemented */
+#define __NR_setpgrp 82 /* BSD alias for setpgid */
+#define __NR_osf_setitimer 83
+#define __NR_osf_old_wait 84 /* not implemented */
+#define __NR_osf_table 85 /* not implemented */
+#define __NR_osf_getitimer 86
+#define __NR_gethostname 87
+#define __NR_sethostname 88
+#define __NR_getdtablesize 89
+#define __NR_dup2 90
+#define __NR_fstat 91
+#define __NR_fcntl 92
+#define __NR_osf_select 93
+#define __NR_poll 94
+#define __NR_fsync 95
+#define __NR_setpriority 96
+#define __NR_socket 97
+#define __NR_connect 98
+#define __NR_accept 99
+#define __NR_getpriority 100
+#define __NR_send 101
+#define __NR_recv 102
+#define __NR_sigreturn 103
+#define __NR_bind 104
+#define __NR_setsockopt 105
+#define __NR_listen 106
+#define __NR_osf_plock 107 /* not implemented */
+#define __NR_osf_old_sigvec 108 /* not implemented */
+#define __NR_osf_old_sigblock 109 /* not implemented */
+#define __NR_osf_old_sigsetmask 110 /* not implemented */
+#define __NR_sigsuspend 111
+#define __NR_osf_sigstack 112
+#define __NR_recvmsg 113
+#define __NR_sendmsg 114
+#define __NR_osf_old_vtrace 115 /* not implemented */
+#define __NR_osf_gettimeofday 116
+#define __NR_osf_getrusage 117
+#define __NR_getsockopt 118
+
+#define __NR_readv 120
+#define __NR_writev 121
+#define __NR_osf_settimeofday 122
+#define __NR_fchown 123
+#define __NR_fchmod 124
+#define __NR_recvfrom 125
+#define __NR_setreuid 126
+#define __NR_setregid 127
+#define __NR_rename 128
+#define __NR_truncate 129
+#define __NR_ftruncate 130
+#define __NR_flock 131
+#define __NR_setgid 132
+#define __NR_sendto 133
+#define __NR_shutdown 134
+#define __NR_socketpair 135
+#define __NR_mkdir 136
+#define __NR_rmdir 137
+#define __NR_osf_utimes 138
+#define __NR_osf_old_sigreturn 139 /* not implemented */
+#define __NR_osf_adjtime 140 /* not implemented */
+#define __NR_getpeername 141
+#define __NR_osf_gethostid 142 /* not implemented */
+#define __NR_osf_sethostid 143 /* not implemented */
+#define __NR_getrlimit 144
+#define __NR_setrlimit 145
+#define __NR_osf_old_killpg 146 /* not implemented */
+#define __NR_setsid 147
+#define __NR_quotactl 148
+#define __NR_osf_oldquota 149 /* not implemented */
+#define __NR_getsockname 150
+
+#define __NR_osf_pid_block 153 /* not implemented */
+#define __NR_osf_pid_unblock 154 /* not implemented */
+
+#define __NR_sigaction 156
+#define __NR_osf_sigwaitprim 157 /* not implemented */
+#define __NR_osf_nfssvc 158 /* not implemented */
+#define __NR_osf_getdirentries 159
+#define __NR_osf_statfs 160
+#define __NR_osf_fstatfs 161
+
+#define __NR_osf_asynch_daemon 163 /* not implemented */
+#define __NR_osf_getfh 164 /* not implemented */
+#define __NR_osf_getdomainname 165
+#define __NR_setdomainname 166
+
+#define __NR_osf_exportfs 169 /* not implemented */
+
+#define __NR_osf_alt_plock 181 /* not implemented */
+
+#define __NR_osf_getmnt 184 /* not implemented */
+
+#define __NR_osf_alt_sigpending 187 /* not implemented */
+#define __NR_osf_alt_setsid 188 /* not implemented */
+
+#define __NR_osf_swapon 199
+#define __NR_msgctl 200
+#define __NR_msgget 201
+#define __NR_msgrcv 202
+#define __NR_msgsnd 203
+#define __NR_semctl 204
+#define __NR_semget 205
+#define __NR_semop 206
+#define __NR_osf_utsname 207
+#define __NR_lchown 208
+#define __NR_osf_shmat 209
+#define __NR_shmctl 210
+#define __NR_shmdt 211
+#define __NR_shmget 212
+#define __NR_osf_mvalid 213 /* not implemented */
+#define __NR_osf_getaddressconf 214 /* not implemented */
+#define __NR_osf_msleep 215 /* not implemented */
+#define __NR_osf_mwakeup 216 /* not implemented */
+#define __NR_msync 217
+#define __NR_osf_signal 218 /* not implemented */
+#define __NR_osf_utc_gettime 219 /* not implemented */
+#define __NR_osf_utc_adjtime 220 /* not implemented */
+
+#define __NR_osf_security 222 /* not implemented */
+#define __NR_osf_kloadcall 223 /* not implemented */
+
+#define __NR_getpgid 233
+#define __NR_getsid 234
+#define __NR_sigaltstack 235
+#define __NR_osf_waitid 236 /* not implemented */
+#define __NR_osf_priocntlset 237 /* not implemented */
+#define __NR_osf_sigsendset 238 /* not implemented */
+#define __NR_osf_set_speculative 239 /* not implemented */
+#define __NR_osf_msfs_syscall 240 /* not implemented */
+#define __NR_osf_sysinfo 241
+#define __NR_osf_uadmin 242 /* not implemented */
+#define __NR_osf_fuser 243 /* not implemented */
+#define __NR_osf_proplist_syscall 244
+#define __NR_osf_ntp_adjtime 245 /* not implemented */
+#define __NR_osf_ntp_gettime 246 /* not implemented */
+#define __NR_osf_pathconf 247 /* not implemented */
+#define __NR_osf_fpathconf 248 /* not implemented */
+
+#define __NR_osf_uswitch 250 /* not implemented */
+#define __NR_osf_usleep_thread 251
+#define __NR_osf_audcntl 252 /* not implemented */
+#define __NR_osf_audgen 253 /* not implemented */
+#define __NR_sysfs 254
+#define __NR_osf_subsys_info 255 /* not implemented */
+#define __NR_osf_getsysinfo 256
+#define __NR_osf_setsysinfo 257
+#define __NR_osf_afs_syscall 258 /* not implemented */
+#define __NR_osf_swapctl 259 /* not implemented */
+#define __NR_osf_memcntl 260 /* not implemented */
+#define __NR_osf_fdatasync 261 /* not implemented */
+
+
+/*
+ * Linux-specific system calls begin at 300
+ */
+#define __NR_bdflush 300
+#define __NR_sethae 301
+#define __NR_mount 302
+#define __NR_old_adjtimex 303
+#define __NR_swapoff 304
+#define __NR_getdents 305
+#define __NR_create_module 306
+#define __NR_init_module 307
+#define __NR_delete_module 308
+#define __NR_get_kernel_syms 309
+#define __NR_syslog 310
+#define __NR_reboot 311
+#define __NR_clone 312
+#define __NR_uselib 313
+#define __NR_mlock 314
+#define __NR_munlock 315
+#define __NR_mlockall 316
+#define __NR_munlockall 317
+#define __NR_sysinfo 318
+#define __NR__sysctl 319
+/* 320 was sys_idle. */
+#define __NR_oldumount 321
+#define __NR_swapon 322
+#define __NR_times 323
+#define __NR_personality 324
+#define __NR_setfsuid 325
+#define __NR_setfsgid 326
+#define __NR_ustat 327
+#define __NR_statfs 328
+#define __NR_fstatfs 329
+#define __NR_sched_setparam 330
+#define __NR_sched_getparam 331
+#define __NR_sched_setscheduler 332
+#define __NR_sched_getscheduler 333
+#define __NR_sched_yield 334
+#define __NR_sched_get_priority_max 335
+#define __NR_sched_get_priority_min 336
+#define __NR_sched_rr_get_interval 337
+#define __NR_afs_syscall 338
+#define __NR_uname 339
+#define __NR_nanosleep 340
+#define __NR_mremap 341
+#define __NR_nfsservctl 342
+#define __NR_setresuid 343
+#define __NR_getresuid 344
+#define __NR_pciconfig_read 345
+#define __NR_pciconfig_write 346
+#define __NR_query_module 347
+#define __NR_prctl 348
+#define __NR_pread 349
+#define __NR_pwrite 350
+#define __NR_rt_sigreturn 351
+#define __NR_rt_sigaction 352
+#define __NR_rt_sigprocmask 353
+#define __NR_rt_sigpending 354
+#define __NR_rt_sigtimedwait 355
+#define __NR_rt_sigqueueinfo 356
+#define __NR_rt_sigsuspend 357
+#define __NR_select 358
+#define __NR_gettimeofday 359
+#define __NR_settimeofday 360
+#define __NR_getitimer 361
+#define __NR_setitimer 362
+#define __NR_utimes 363
+#define __NR_getrusage 364
+#define __NR_wait4 365
+#define __NR_adjtimex 366
+#define __NR_getcwd 367
+#define __NR_capget 368
+#define __NR_capset 369
+#define __NR_sendfile 370
+#define __NR_setresgid 371
+#define __NR_getresgid 372
+#define __NR_dipc 373
+#define __NR_pivot_root 374
+#define __NR_mincore 375
+#define __NR_pciconfig_iobase 376
+#define __NR_getdents64 377
+#define __NR_gettid 378
+#define __NR_readahead 379
+#define __NR_security 380 /* syscall for security modules */
+#define __NR_tkill 381
+#define __NR_setxattr 382
+#define __NR_lsetxattr 383
+#define __NR_fsetxattr 384
+#define __NR_getxattr 385
+#define __NR_lgetxattr 386
+#define __NR_fgetxattr 387
+#define __NR_listxattr 388
+#define __NR_llistxattr 389
+#define __NR_flistxattr 390
+#define __NR_removexattr 391
+#define __NR_lremovexattr 392
+#define __NR_fremovexattr 393
+#define __NR_futex 394
+#define __NR_sched_setaffinity 395
+#define __NR_sched_getaffinity 396
+#define __NR_tuxcall 397
+#define __NR_io_setup 398
+#define __NR_io_destroy 399
+#define __NR_io_getevents 400
+#define __NR_io_submit 401
+#define __NR_io_cancel 402
+#define __NR_alloc_hugepages 403
+#define __NR_free_hugepages 404
+#define __NR_exit_group 405
+#define __NR_lookup_dcookie 406
+#define __NR_sys_epoll_create 407
+#define __NR_sys_epoll_ctl 408
+#define __NR_sys_epoll_wait 409
+#define __NR_remap_file_pages 410
+#define __NR_set_tid_address 411
+
+#define syscall_weak(name,wsym,sym) \
+.text ; \
+.align 2 ; \
+.weak wsym; \
+.type wsym,@function ; \
+wsym: ; \
+.global sym ; \
+.type sym,@function ; \
+sym: ; \
+ lda $0, __NR_##name($31) ; \
+ br __unified_syscall
+
+#define syscall(name,sym) \
+.text ; \
+.align 2 ; \
+.global sym ; \
+.type sym,@function ; \
+sym: ; \
+ lda $0, __NR_##name($31) ; \
+ br __unified_syscall
+
diff --git a/mdk-stage1/dietlibc/alpha/unified.S b/mdk-stage1/dietlibc/alpha/unified.S
index 02a1c9bcd..506bf7387 100644
--- a/mdk-stage1/dietlibc/alpha/unified.S
+++ b/mdk-stage1/dietlibc/alpha/unified.S
@@ -1,15 +1,25 @@
#include <dietfeatures.h>
+#include "syscalls.h"
+.weak exit
+exit:
+.global _exit
+_exit:
+ lda $0, __NR_exit
.global __unified_syscall
__unified_syscall:
callsys
bne $19, .Lerror
+
+/* here we go and "reuse" the return for weak-void functions */
+#include "dietuglyweaks.h"
+
ret $31, ($26), 0x01
.Lerror:
.global error_unified_syscall
error_unified_syscall:
-#ifdef WANT_THREAD_SAVE
+#ifdef WANT_THREAD_SAFE
lda $sp, -16($sp) /* alloc 2 qwords on stack */
stq $26, 0($sp) /* save ra to stack */
stq $0, 8($sp) /* save v0 to stack */
diff --git a/mdk-stage1/dietlibc/binshstr.h b/mdk-stage1/dietlibc/binshstr.h
new file mode 100644
index 000000000..f1bf789fe
--- /dev/null
+++ b/mdk-stage1/dietlibc/binshstr.h
@@ -0,0 +1,6 @@
+
+extern const char __binsh [8];
+
+#define __sh (__binsh + 5 )
+
+/* end of binshstr.h */
diff --git a/mdk-stage1/dietlibc/diet.1 b/mdk-stage1/dietlibc/diet.1
new file mode 100644
index 000000000..c28aeba40
--- /dev/null
+++ b/mdk-stage1/dietlibc/diet.1
@@ -0,0 +1,31 @@
+.TH diet 1 "April 2001"
+.SH NAME
+.PP
+diet \- mangle gcc command line arguments
+.SH SYNOPSIS
+.PP
+.B diet [-v] [-Os]
+[\fInormal gcc command line\fP]
+.SH DESCRIPTION
+.PP
+diet is a small wrapper around gcc. It will try to look at the command
+line you specify and try to mangle it so that gcc will compile against
+the diet libc header files and link against the diet libc itself.
+
+diet tries to be smart for cross compiling. If the first argument is
+not gcc but sparc-linux-gcc, diet will guess that you want to cross
+compile for sparc and use bin-sparc/dietlibc.a instead of the dietlibc.a
+for your default architecture.
+
+The -v option will make diet print the modified gcc command line before
+executing it.
+
+When passed the -Os option before the gcc argument, diet will mangle the
+gcc options to include the best known for-size optimization settings for
+the platform.
+.SH FILES
+~/.diet/\fIcompiler\fR may contain compiler options as you would
+specify them on the command line, i.e. separated by spaces. Those will
+then be used instead of the built-in defaults for diet -Os.
+.SH AUTHOR
+Felix von Leitner <felix-dietlibc@fefe.de>
diff --git a/mdk-stage1/dietlibc/diet.c b/mdk-stage1/dietlibc/diet.c
index 1de6befc8..86b21a1e1 100644
--- a/mdk-stage1/dietlibc/diet.c
+++ b/mdk-stage1/dietlibc/diet.c
@@ -1,7 +1,11 @@
#include <string.h>
#include <unistd.h>
+#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
+#include <write12.h>
+
+#include "dietfeatures.h"
/* goal:
* when invoked as
@@ -15,90 +19,337 @@
* "sparc-linux-gcc -nostdlib -static -o t t.o /path/to/dietlibc/bin-sparc/start.o /path/to/dietlibc/bin-sparc/dietlibc.a"
*/
-void error(const char *message) {
- write(2,message,strlen(message));
+static void error(const char *message) {
+ __write2(message);
exit(1);
}
+static const char* Os[] = {
+ "i386","-Os","-mpreferred-stack-boundary=2",
+ "-malign-functions=0","-malign-jumps=0",
+ "-malign-loops=0","-fomit-frame-pointer",0,
+ "x86_64","-Os","-fno-omit-frame-pointer",0,
+ "sparc","-Os","-mcpu=supersparc",0,
+ "sparc64","-Os","-m64",0,
+ "alpha","-Os","-fomit-frame-pointer",0,
+ "arm","-Os","-fomit-frame-pointer",0,
+ "mips","-Os","-fomit-frame-pointer","-mno-abicalls","-G","8","-fno-pic",0,
+ "ppc","-Os","-fomit-frame-pointer","-mpowerpc-gpopt","-mpowerpc-gfxopt",0,
+ "s390","-Os","-fomit-frame-pointer",0,
+ "sh","-Os","-fomit-frame-pointer",0,
+ "ia64","-Os","-fno-omit-frame-pointer",0,
+ "x86_64","-Os","-fstrict-aliasing","-momit-leaf-frame-pointer","-mfance-math-387",0,
+ 0};
+
int main(int argc,char *argv[]) {
- int link=0;
+ int _link=0;
int compile=0;
+ int preprocess=0;
+ int verbose=0;
+ int profile=0;
char diethome[]=DIETHOME;
- char platform[1000]=DIETHOME "/bin-";
- char *nostdlib="-nostdlib";
- char *libgcc="-lgcc";
- char dashL[1000]="-L";
+ char platform[1000];
+#ifdef __DYN_LIB
+ int shared=0;
+#endif
+ char* shortplatform=0;
+#ifdef WANT_SAFEGUARD
+ char safeguard1[]="-include";
+ char safeguard2[]=DIETHOME "/include/dietref.h";
+#endif
+ const char *nostdlib="-nostdlib";
+ const char *libgcc="-lgcc";
+ char dashL[1000];
+ char dashstatic[]="-static";
int i;
+ int mangleopts=0;
+ char manglebuf[1024];
+
+#ifdef INSTALLVERSION
+ strcpy(platform,DIETHOME "/lib-");
+#else
+#ifndef __DYN_LIB
+ strcpy(platform,DIETHOME "/bin-");
+#else
+ strcpy(platform,DIETHOME "/pic-");
+#endif
+#endif
+ strcpy(dashL,"-L");
if (argc<2) {
- error("usage: diet [gcc command line]\n"
- "e.g. diet gcc -c t.c\n"
+usage:
+ if (verbose) {
+ __write2(
+#ifdef __DYN_LIB
+ "dyn-"
+#endif
+ "diet version " VERSION
+#ifndef INSTALLVERSION
+ " (non-install version in source tree)"
+#endif
+ "\n\n");
+ }
+ error("usage: diet [-v] [-Os] gcc command line\n"
+ "e.g. diet -Os gcc -c t.c\n"
"or diet sparc-linux-gcc -o foo foo.c bar.o\n");
}
+ if (!strcmp(argv[1],"-v")) {
+ ++argv; --argc;
+ verbose=1;
+ }
+ if (argv[1] && !strcmp(argv[1],"-Os")) {
+ ++argv; --argc;
+ mangleopts=1;
+ }
+ if (!argv[1]) goto usage;
{
char *tmp=strchr(argv[1],0)-2;
- char *tmp2;
+ char *tmp2,*tmp3;
char *cc=argv[1];
if (tmp<cc) goto donttouch;
- if ((tmp2=strchr(cc,'-'))) { /* cross compiling? */
+ if ((tmp2=strstr(cc,"linux-"))) { /* cross compiling? */
int len=strlen(platform);
+ --tmp2;
+ tmp3=strchr(cc,'-');
+ if (tmp3<tmp2) tmp2=tmp3;
if (tmp2-cc>90) error("platform name too long!\n");
- memmove(platform+len,argv[1],tmp2-cc);
+ shortplatform=platform+len;
+ memmove(shortplatform,argv[1],(size_t)(tmp2-cc));
platform[tmp2-cc+len]=0;
-/* printf("found platform %s\n",platform); */
+ if (shortplatform[0]=='i' && shortplatform[2]=='8' && shortplatform[3]=='6') shortplatform[1]='3';
} else {
#ifdef __sparc__
- strcat(platform,"sparc");
+#ifdef __arch64__
+ shortplatform="sparc64";
+#else
+ shortplatform="sparc";
#endif
-#ifdef __ppc__
- strcat(platform,"ppc");
+#endif
+#ifdef __powerpc__
+ shortplatform="ppc";
#endif
#ifdef __i386__
- strcat(platform,"i386");
+ shortplatform="i386";
#endif
#ifdef __alpha__
- strcat(platform,"alpha");
+ shortplatform="alpha";
#endif
#ifdef __arm__
- strcat(platform,"arm");
+ shortplatform="arm";
#endif
#ifdef __mips__
- strcat(platform,"mips");
+ shortplatform="mips";
+#endif
+#ifdef __s390__
+ shortplatform="s390";
+#endif
+#ifdef __sh__
+ shortplatform="sh";
+#endif
+#ifdef __hppa__
+ shortplatform="parisc";
+#endif
+#ifdef __x86_64__
+ shortplatform="x86_64";
+#endif
+#ifdef __ia64__
+ shortplatform="ia64";
#endif
+ {
+ char *tmp=platform+strlen(platform);
+ strcpy(tmp,shortplatform);
+ shortplatform=tmp;
+ }
+ }
+ /* MIPS needs special handling. If argv contains -EL, change
+ * platform name to mipsel */
+ if (!strcmp(shortplatform,"mips")) {
+ int i;
+ for (i=1; i<argc; ++i)
+ if (!strcmp(argv[i],"-EL"))
+ strcpy(shortplatform,"mipsel");
}
strcat(dashL,platform);
if (!strcmp(tmp,"cc")) {
char **newargv;
char **dest;
char *a,*b,*c;
+#ifdef WANT_DYNAMIC
+ char *d,*e,*f;
+#endif
/* we need to add -I... if the command line contains -c, -S or -E */
- for (i=2; i<argc; ++i)
- if (!strcmp(argv[i],"-c") || !strcmp(argv[i],"-S") || !strcmp(argv[i],"-E"))
+ for (i=2; i<argc; ++i) {
+ if (argv[i][0]=='-' && argv[i][1]=='M')
+ goto pp;
+ if (!strcmp(argv[i],"-pg"))
+ profile=1;
+ if (!strcmp(argv[i],"-c") || !strcmp(argv[i],"-S"))
compile=1;
+ if (!strcmp(argv[i],"-E"))
+pp:
+ preprocess=compile=1;
+ }
/* we need to add -nostdlib if we are not compiling*/
- link=!compile;
+ _link=!compile;
+#ifdef __DYN_LIB
+ if (_link) {
+ for (i=2; i<argc; ++i)
+ if (!strcmp(argv[i],"-shared")) {
+ shared=1;
+ _link=0;
+ }
+ }
+#endif
#if 0
for (i=2; i<argc; ++i)
if (!strcmp(argv[i],"-o"))
- if (!compile) link=1;
+ if (!compile) _link=1;
#endif
- newargv=alloca(sizeof(char*)*(argc+6));
+ newargv=alloca(sizeof(char*)*(argc+100));
a=alloca(strlen(diethome)+20);
b=alloca(strlen(platform)+20);
c=alloca(strlen(platform)+20);
strcpy(a,"-I"); strcat(a,diethome); strcat(a,"/include");
- strcpy(b,platform); strcat(b,"/start.o");
+#ifndef __DYN_LIB
+ strcpy(b,platform);
+ if (profile) strcat(b,"/pstart.o"); else strcat(b,"/start.o");
+#ifdef INSTALLVERSION
+ strcpy(c,platform); strcat(c,"/libc.a");
+#else
strcpy(c,platform); strcat(c,"/dietlibc.a");
+#endif
+#else
+ strcpy(b,platform); strcat(b,"/dstart.o");
+ strcpy(c,"-lc");
+#endif
+
+#ifdef WANT_DYNAMIC
+ d=alloca(strlen(platform)+20);
+ e=alloca(strlen(platform)+20);
+#ifdef __DYN_LIB
+ strcpy(d,platform);
+ strcpy(e,platform);
+ if (shared)
+ strcat(d,"/dyn_so_start.o");
+#ifdef INSTALLVERSION
+ else
+ strcat(d,"/dyn_dstart.o");
+ strcat(e,"/dyn_dstop.o");
+#else
+ else
+ strcat(d,"/dyn_start.o");
+ strcat(e,"/dyn_stop.o");
+#endif
+#else
+ strcpy(d,platform); strcat(d,"/dyn_start.o");
+ strcpy(e,platform); strcat(e,"/dyn_stop.o");
+#endif
+#endif
dest=newargv;
*dest++=argv[1];
- if (link) { *dest++=nostdlib; *dest++=dashL; }
- if (compile || link) *dest++=a;
- for (i=2; i<argc; ++i)
+#ifndef __DYN_LIB
+ if (_link) { *dest++=(char*)nostdlib; *dest++=dashstatic; *dest++=dashL; }
+#else
+ /* avoid R_*_COPY relocations */
+ *dest++="-fPIC";
+ if (_link || shared) { *dest++=(char*)nostdlib; *dest++=dashL; }
+#endif
+#ifdef WANT_SAFEGUARD
+ if (compile && !preprocess) {
+ *dest++=safeguard1;
+ *dest++=safeguard2;
+ }
+#endif
+ if (_link) { *dest++=b; }
+#ifdef WANT_DYNAMIC
+ if (_link) { *dest++=d; }
+#endif
+ for (i=2; i<argc; ++i) {
+ if (mangleopts)
+ if (argv[i][0]=='-' && (argv[i][1]=='O' || argv[i][1]=='f' || argv[i][1]=='m')) {
+ if (strcmp(argv[i],"-fpic") && strcmp(argv[i],"-fno-pic"))
+ continue;
+ }
*dest++=argv[i];
- if (link) { *dest++=b; *dest++=c; *dest++=libgcc; }
+ }
+#ifndef __DYN_LIB
+ if (compile || _link) *dest++=a;
+#else
+ if (compile || _link || shared) *dest++=a;
+#endif
+ *dest++="-D__dietlibc__";
+ if (mangleopts) {
+ const char **o=Os;
+
+ {
+ int fd;
+ char* tmp=getenv("HOME");
+ if (tmp) {
+ if (strlen(tmp)+strlen(cc)<900) {
+ strcpy(manglebuf,tmp);
+ strcat(manglebuf,"/.diet/");
+ strcat(manglebuf,cc);
+ if ((fd=open(manglebuf,O_RDONLY))>=0) {
+ int len=read(fd,manglebuf,1023);
+ if (len>0) {
+ int i;
+ manglebuf[len]=0;
+ *dest++=manglebuf;
+ for (i=1; i<len; ++i) {
+ if (manglebuf[i]==' ' || manglebuf[i]=='\n') {
+ manglebuf[i]=0;
+ if (i+1<len)
+ *dest++=manglebuf+i+1;
+ }
+ }
+ goto incorporated;
+ }
+ }
+ }
+ }
+ }
+ for (o=Os;*o;++o) {
+ if (!strcmp(*o,shortplatform)) {
+ ++o;
+ while (*o) {
+ *dest++=(char*)*o;
+ ++o;
+ }
+ break;
+ } else
+ while (*o) ++o;
+ }
+ }
+incorporated:
+ if (_link) {
+ if (profile) *dest++="-lgmon";
+ *dest++=c; *dest++=(char*)libgcc;
+ }
+#ifdef WANT_DYNAMIC
+ if (_link) { *dest++=e; }
+#endif
+#ifdef __DYN_LIB
+ if (shared){ *dest++=c; }
+ f=alloca(strlen(platform)+100);
+ if (_link) {
+ strcpy(f,"-Wl,-dynamic-linker=");
+ strcat(f,platform);
+// strcat(f,"/diet-linux.so");
+ strcat(f,"/libdl.so");
+ *dest++=f;
+ }
+#endif
*dest=0;
+ if (verbose) {
+ int i;
+ for (i=0; newargv[i]; i++) {
+ __write2(newargv[i]);
+ __write2(" ");
+ }
+ __write2("\n");
+ }
execvp(newargv[0],newargv);
goto error;
} else if (!strcmp(tmp,"ld")) {
@@ -107,6 +358,6 @@ int main(int argc,char *argv[]) {
donttouch:
execvp(argv[1],argv+1);
error:
- error("execvp failed!\n");
+ error("execvp() failed!\n");
return 1;
}
diff --git a/mdk-stage1/dietlibc/dietdirent.h b/mdk-stage1/dietlibc/dietdirent.h
index d732cf7dc..dbd7206a6 100644
--- a/mdk-stage1/dietlibc/dietdirent.h
+++ b/mdk-stage1/dietlibc/dietdirent.h
@@ -1,6 +1,8 @@
+#include <sys/shm.h>
+
struct __dirstream {
int fd;
- char buf[1024];
+ char buf[PAGE_SIZE-(sizeof (int)*3)];
unsigned int num;
unsigned int cur;
}; /* stream data from opendir() */
diff --git a/mdk-stage1/dietlibc/dietdns.h b/mdk-stage1/dietlibc/dietdns.h
new file mode 100644
index 000000000..c4c1c5f72
--- /dev/null
+++ b/mdk-stage1/dietlibc/dietdns.h
@@ -0,0 +1,4 @@
+
+int __dns_gethostbyx_r(const char* name, struct hostent* result,
+ char *buf, size_t buflen,
+ struct hostent **RESULT, int *h_errnop, int lookfor);
diff --git a/mdk-stage1/dietlibc/dietfeatures.h b/mdk-stage1/dietlibc/dietfeatures.h
index e1de38577..1692de348 100644
--- a/mdk-stage1/dietlibc/dietfeatures.h
+++ b/mdk-stage1/dietlibc/dietfeatures.h
@@ -3,40 +3,106 @@
/* feel free to comment some of these out to reduce code size */
-//#define WANT_FLOATING_POINT_IN_PRINTF
-//#define WANT_FLOATING_POINT_IN_SCANF
+#define WANT_FLOATING_POINT_IN_PRINTF
+#define WANT_FLOATING_POINT_IN_SCANF
#define WANT_CHARACTER_CLASSES_IN_SCANF
#define WANT_NULL_PRINTF
+#define WANT_LONGLONG_PRINTF
+#define WANT_LONGLONG_SCANF
-#define SLASH_PROC_OK
+/* 128 or 2048 bytes buffer size? */
+/* #define WANT_SMALL_STDIO_BUFS */
+
+/* want fread to read() directly if size of data is larger than buffer?
+ * This costs a few bytes but is worth it if the application is already
+ * buffering. */
+#define WANT_FREAD_OPTIMIZATION
-// #define WANT_BUFFERED_STDIO
+/* this is only for meaningful for ttyname and sysconf_cpus so far */
+#define SLASH_PROC_OK
/* use errno_location instead of errno */
-// #define WANT_THREAD_SAFE
+#define WANT_THREAD_SAFE
-/* make the startcode, etc. dynamic aware */
-/* #undef WANT_DYNAMIC */
+/* make the startcode, etc. dynamic aware ({con,de}structors) */
+/* #define WANT_DYNAMIC */
/* do you want smaller or faster string routines? */
/* #define WANT_FASTER_STRING_ROUTINES */
-/* do you want ungetc? makes fgetc more complex */
-#define WANT_UNGETC
+/* define this to have strncpy zero-fill and not just zero-terminate the
+ * string */
+/* #define WANT_FULL_POSIX_COMPAT */
-// #define WANT_LINKER_WARNINGS
+/* read the comment in lib/strncat.c for an explanation */
+/* #define WANT_NON_COMPLIANT_STRNCAT */
+
+#undef WANT_LINKER_WARNINGS
/* you need to define this if you want to run your programs with large
- * file support on kernel 2.2 or 2.4 */
-// #define WANT_LARGEFILE_BACKCOMPAT
+ * file support on kernel 2.2 or 2.0 */
+#undef WANT_LARGEFILE_BACKCOMPAT
/* do you want localtime(3) to read /etc/localtime?
* Needed for daylight saving time etc. */
-// #define WANT_TZFILE_PARSER
+#define WANT_TZFILE_PARSER
+
+/* do you want the DNS routines to parse and use "domain" and "search"
+ * lines from /etc/resolv.conf? Normally not used on boot floppies and
+ * embedded environments. */
+#define WANT_FULL_RESOLV_CONF
+
+/* do you want IPv6 transport support in the DNS resolver? */
+#undef WANT_IPV6_DNS
+
+/* do you want gethostbyname and friends to consult /etc/hosts? */
+#define WANT_ETC_HOSTS
+
+/* do you want gethostbyname to understand dotted decimal IP numbers
+ * directly and not try to resolve them? */
+#define WANT_INET_ADDR_DNS
+
+/* do you want math functions high precision rather than fast/small? */
+#undef WANT_HIGH_PRECISION_MATH
+
+/* do you want support for matherr? */
+#define WANT_MATHERR
+
+/* do you want crypt(3) to use MD5 if the salt starts with "$1$"? */
+#define WANT_CRYPT_MD5
+
+/* do you want diet to include a safeguard dependency to make linking
+ * against glibc fail? This may fail with older binutils. */
+#undef WANT_SAFEGUARD
+
+/* dy you want that malloc(0) return a pointer to a "zero-length" object
+ * that is realloc-able; means realloc(..,size) gives a NEW object (like a
+ * call to malloc(size)).
+ * WARNING: this violates C99 */
+/* #define WANT_MALLOC_ZERO */
+
/* stop uncommenting here ;-) */
#ifndef WANT_FASTER_STRING_ROUTINES
#define WANT_SMALL_STRING_ROUTINES
#endif
+#ifdef WANT_THREAD_SAFE
+#ifndef __ASSEMBLER__
+#define errno (*__errno_location())
+#define _REENTRANT
+#endif
+#endif
+
+#ifdef __DYN_LIB
+/* with shared libraries you MUST have a dynamic aware startcode */
+#ifndef WANT_DYNAMIC
+#define WANT_DYNAMIC
+#endif
+/* saveguard crashes with shared objects ... */
+#ifdef WANT_SAFEGUARD
+#undef WANT_SAFEGUARD
+#endif
+#endif
+
#endif
diff --git a/mdk-stage1/dietlibc/dieticonv.h b/mdk-stage1/dietlibc/dieticonv.h
new file mode 100644
index 000000000..540ef2f6f
--- /dev/null
+++ b/mdk-stage1/dietlibc/dieticonv.h
@@ -0,0 +1,12 @@
+enum charset {
+ INVALID=0,
+ ISO_8859_1,
+ UTF_8,
+ UCS_2,
+ UCS_4
+};
+
+#define ic_from(x) (((x) )&0xffff)
+#define ic_to(x) (((x)>>16)&0xffff)
+
+#include <iconv.h>
diff --git a/mdk-stage1/dietlibc/dietlibm.h b/mdk-stage1/dietlibc/dietlibm.h
new file mode 100644
index 000000000..fe735e40d
--- /dev/null
+++ b/mdk-stage1/dietlibc/dietlibm.h
@@ -0,0 +1,5 @@
+#include <sys/types.h>
+
+double __poly(double x, size_t n, const double* c);
+double exp2(double x);
+double log2(double x);
diff --git a/mdk-stage1/dietlibc/dietstdarg.h b/mdk-stage1/dietlibc/dietstdarg.h
deleted file mode 100644
index 827671b22..000000000
--- a/mdk-stage1/dietlibc/dietstdarg.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <stdarg.h>
-
-/* this assumes that va_copy() will be a macro, it is on gcc */
-#ifndef va_copy
-# ifdef __va_copy
-# define va_copy(x, y) __va_copy(x, y)
-# else
-/* assume copying it works... */
-# define va_copy(x, y) x = y
-# endif
-#endif
-
diff --git a/mdk-stage1/dietlibc/dietstdio.h b/mdk-stage1/dietlibc/dietstdio.h
index a1cbeba83..6eba480c4 100644
--- a/mdk-stage1/dietlibc/dietstdio.h
+++ b/mdk-stage1/dietlibc/dietstdio.h
@@ -1,81 +1,76 @@
-/* diet stdio -- no buffering ;-} */
+/* diet stdio */
-#include "dietfeatures.h"
+#include <sys/cdefs.h>
#include <sys/types.h>
-#ifdef WANT_THREAD_SAVE
+#include "dietfeatures.h"
+#ifdef WANT_THREAD_SAFE
#include <pthread.h>
#endif
+#include <stdarg.h>
+#ifdef WANT_SMALL_STDIO_BUFS
#define BUFSIZE 128
+#else
+#define BUFSIZE 2048
+#endif
-typedef struct __file {
+struct __stdio_file {
int fd;
int flags;
-#ifdef WANT_BUFFERED_STDIO
unsigned int bs; /* read: bytes in buffer */
unsigned int bm; /* position in buffer */
- char buf[BUFSIZE];
- struct __file *next; /* for fflush */
-#endif
+ unsigned int buflen; /* length of buf */
+ char *buf;
+ struct __stdio_file *next; /* for fflush */
pid_t popen_kludge;
-#ifdef WANT_UNGETC
- char ungetbuf;
+ unsigned char ungetbuf;
char ungotten;
-#endif
-#ifdef WANT_THREAD_SAVE
+#ifdef WANT_THREAD_SAFE
pthread_mutex_t m;
#endif
-} FILE;
-
-extern FILE *__stdio_root;
+};
#define ERRORINDICATOR 1
#define EOFINDICATOR 2
#define BUFINPUT 4
#define BUFLINEWISE 8
#define NOBUF 16
-#define UNSEEKABLE 32
+#define STATICBUF 32
#define _IONBF 0
#define _IOLBF 1
#define _IOFBF 2
+#include <stdio.h>
+
/* internal function to flush buffer.
* However, if next is BUFINPUT and the buffer is an input buffer, it
* will not be flushed. Vice versa for output */
extern int __fflush4(FILE *stream,int next);
+extern int __buffered_outs(const char *s,size_t len);
-FILE *fopen (const char *path, const char *mode);
-FILE *fdopen (int fildes, const char *mode);
-FILE *freopen (const char *path, const char *mode, FILE *stream);
-
-int fgetc(FILE *stream);
-char *fgets(char *s, int size, FILE *stream);
-int getc(FILE *stream);
-int getchar(void);
-char *gets(char *s);
-int ungetc(int c, FILE *stream);
+/* ..scanf */
+struct arg_scanf {
+ void *data;
+ int (*getch)(void*);
+ int (*putch)(int,void*);
+};
-int fputc(int c, FILE *stream);
-int fputs(const char *s, FILE *stream);
-int putc(int c, FILE *stream);
-int putchar(int c);
-int puts(const char *s);
+int __v_scanf(struct arg_scanf* fn, const unsigned char *format, va_list arg_ptr);
-long fseek( FILE *stream, long offset, int whence);
-long ftell( FILE *stream);
-void rewind( FILE *stream);
-int fgetpos( FILE *stream, fpos_t *pos);
-int fsetpos( FILE *stream, fpos_t *pos);
+struct arg_printf {
+ void *data;
+ int (*put)(void*,size_t,void*);
+};
-size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream);
+int __v_printf(struct arg_printf* fn, const unsigned char *format, va_list arg_ptr);
-size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream);
-
-int fflush(FILE *stream);
-
-int fclose(FILE *stream);
+extern FILE *__stdio_root;
-extern FILE *stdout, *stderr, *stdin;
+int __fflush_stdin(void);
+int __fflush_stdout(void);
+int __fflush_stderr(void);
-#define EOF (int)(-1)
+FILE* __stdio_init_file(int fd,int closeonerror);
+int __stdio_parse_mode(const char *mode);
+void __stdio_flushall(void);
diff --git a/mdk-stage1/dietlibc/dietuglyweaks.h b/mdk-stage1/dietlibc/dietuglyweaks.h
new file mode 100644
index 000000000..4b2aa231a
--- /dev/null
+++ b/mdk-stage1/dietlibc/dietuglyweaks.h
@@ -0,0 +1,24 @@
+#ifndef __DIET_UGLY_WEAKS__
+#define __DIET_UGLY_WEAKS__
+
+/* if you change something here ... KNOW what you're doing !
+ * it'll effect ALL platforms ! */
+
+.weak __thread_doexit
+__thread_doexit:
+.weak __fflush_stdin
+__fflush_stdin:
+.weak __fflush_stdout
+__fflush_stdout:
+.weak __fflush_stderr
+__fflush_stderr:
+.weak flockfile
+flockfile:
+.weak funlockfile
+funlockfile:
+.weak __nop
+__nop:
+.global __you_tried_to_link_a_dietlibc_object_against_glibc
+__you_tried_to_link_a_dietlibc_object_against_glibc:
+
+#endif
diff --git a/mdk-stage1/dietlibc/dirstream.h b/mdk-stage1/dietlibc/dirstream.h
deleted file mode 100644
index dc8fba79c..000000000
--- a/mdk-stage1/dietlibc/dirstream.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the, 1992 Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
-
-/*
- * POSIX Standard: 5.1.2 Directory Operations <dirent.h>
- */
-
-#ifndef _DIRSTREAM_H
-
-#define _DIRSTREAM_H 1
-
-#include <sys/types.h>
-#include <dirent.h>
-#ifdef _POSIX_THREADS
-#include <pthread.h>
-#endif
-
-/* For now, syscall readdir () only supports one entry at a time. It
- * will be changed in the future.
-#define NUMENT 3
-*/
-#ifndef NUMENT
-#define NUMENT 1
-#endif
-
-#define SINGLE_READDIR 11
-#define MULTI_READDIR 12
-#define NEW_READDIR 13
-
-/* Directory stream type. */
-struct __dirstream {
- /* file descriptor */
- int dd_fd;
-
- /* offset of the next dir entry in buffer */
- off_t dd_nextloc;
-
- /* bytes of valid entries in buffer */
- size_t dd_size;
-
- /* -> directory buffer */
- struct dirent *dd_buf;
-
- /* we have to convert */
- struct dirent convbuf;
-
- /* offset of the next dir entry in directory. */
- off_t dd_nextoff;
-
- /* total size of buffer */
- size_t dd_max;
-
- enum {unknown, have_getdents, no_getdents} dd_getdents;
-
- /* lock */
-#ifdef _POSIX_THREADS
- pthread_mutex_t *dd_lock;
-#else
- void *dd_lock;
-#endif
-}; /* stream data from opendir() */
-
-#endif /* dirent.h */
diff --git a/mdk-stage1/dietlibc/dyn_start.c b/mdk-stage1/dietlibc/dyn_start.c
new file mode 100644
index 000000000..391797e12
--- /dev/null
+++ b/mdk-stage1/dietlibc/dyn_start.c
@@ -0,0 +1,40 @@
+#include "dietfeatures.h"
+
+#ifdef WANT_DYNAMIC
+#include <stdlib.h>
+
+typedef void(*structor)(void);
+
+__attribute__((section(".ctors")))
+static structor __CTOR_LIST__[1]={((structor)-1)};
+
+__attribute__((section(".dtors")))
+static structor __DTOR_LIST__[1]={((structor)-1)};
+
+static void __do_global_dtors_aux(void)
+{
+ structor *df=__CTOR_LIST__; /* ugly trick to prevent warning */
+ for (df=((__DTOR_LIST__)+1);(*df) != (structor)0; df++) (*df)();
+}
+
+void _fini(void) __attribute__((section(".fini")));
+__attribute__((section(".fini"))) void _fini(void)
+{
+ __do_global_dtors_aux();
+}
+
+#ifndef __DYN_LIB_SHARED
+/* pre main, post _start */
+int _dyn_start(int argc, char **argv, char **envp, structor dl_init);
+int _dyn_start(int argc, char **argv, char **envp, structor dl_init)
+{
+ static __attribute__((section(".init"))) void _init(void);
+ int main(int argc, char **argv, char **envp);
+
+ if (dl_init) atexit(dl_init);
+ _init();
+ atexit(_fini);
+ return main(argc, argv, envp);
+}
+#endif
+#endif
diff --git a/mdk-stage1/dietlibc/dyn_stop.c b/mdk-stage1/dietlibc/dyn_stop.c
new file mode 100644
index 000000000..7213a8089
--- /dev/null
+++ b/mdk-stage1/dietlibc/dyn_stop.c
@@ -0,0 +1,23 @@
+#include "dietfeatures.h"
+
+#ifdef WANT_DYNAMIC
+typedef void(*structor)(void);
+
+__attribute__((section(".ctors")))
+static structor __CTOR_END__[1]={((structor)0)};
+
+__attribute__((section(".dtors")))
+static structor __DTOR_END__[1]={((structor)0)};
+
+static void __do_global_ctors_aux(void)
+{
+ structor *cf=__DTOR_END__; /* ugly trick to prevent warning */
+ for(cf=((__CTOR_END__)-1); (*cf) != (structor)-1; cf--) (*cf)();
+}
+
+void _init() __attribute__((section(".init")));
+__attribute__((section(".init"))) void _init()
+{
+ __do_global_ctors_aux();
+}
+#endif
diff --git a/mdk-stage1/dietlibc/findcflags.sh b/mdk-stage1/dietlibc/findcflags.sh
new file mode 100755
index 000000000..8b8b3d74a
--- /dev/null
+++ b/mdk-stage1/dietlibc/findcflags.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+version=`${1:-gcc} -v 2>&1 |sed -n '/gcc version/ {s/gcc version //;p;}'`
+case $version in
+ 2.9*) echo -march=i386 -Os -fomit-frame-pointer -malign-functions=0 -malign-jumps=0 -malign-loops=0 -mpreferred-stack-boundary=2 ;;
+ 3.0*) echo -march=i386 -Os -fomit-frame-pointer -malign-functions=0 -malign-jumps=0 -malign-loops=0 -mpreferred-stack-boundary=2 ;;
+ 3*) echo -Os -fomit-frame-pointer -falign-functions=0 -falign-jumps=0 -falign-loops=0 -mpreferred-stack-boundary=2;;
+ *) echo -O2 -pipe -fomit-frame-pointer ;;
+esac
diff --git a/mdk-stage1/dietlibc/i386/Makefile.add b/mdk-stage1/dietlibc/i386/Makefile.add
index b685cc360..83b18ae29 100644
--- a/mdk-stage1/dietlibc/i386/Makefile.add
+++ b/mdk-stage1/dietlibc/i386/Makefile.add
@@ -1,3 +1,8 @@
-CFLAGS+=-march=i386 -mcpu=i386 -Os -fomit-frame-pointer
+M:=$(shell ./findcflags.sh $(CC))
+LIBOBJ+=$(OBJDIR)/__ten.o $(OBJDIR)/md5asm.o $(OBJDIR)/mmap64.o
+LIBMATH+=acos.o asin.o atan.o atan2.o ceil.o cos.o exp.o exp10.o exp2.o expm1.o fabs.o floor.o hypot.o log.o log10.o log2.o sin.o sqrt.o tan.o copysign.o sincos.o __half.o ldexp.o pow.o ilogb.o cbrt.o log1p.o sqrtl.o fmod.o libm2.o
+#CFLAGS+=-march=i386 -Os -fomit-frame-pointer -malign-functions=0 -malign-jumps=0 -malign-loops=0 -mpreferred-stack-boundary=2
+CFLAGS+=$(M)
VPATH:=i386:syscalls.s:$(VPATH)
+LIBGMON_OBJS+=$(OBJDIR)/mcount.o
diff --git a/mdk-stage1/dietlibc/i386/PIC.h b/mdk-stage1/dietlibc/i386/PIC.h
new file mode 100644
index 000000000..45ddeb446
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/PIC.h
@@ -0,0 +1,82 @@
+#ifndef __I386_PIC_H__
+#define __I386_PIC_H__
+#ifdef __DYN_LIB
+
+#if 1
+/* don't trash the athlon return stack */
+.text
+.Lgetpic:
+ mov (%esp),%ebx
+ ret
+
+.macro PIC_INIT
+ call .Lgetpic
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+.endm
+#else
+/* standard code for PIC init */
+.macro PIC_INIT
+ call 0f
+0: popl %ebx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-0b], %ebx
+.endm
+#endif
+
+#define PIC_SAVE pushl %ebx
+#define PIC_RESTORE popl %ebx
+
+
+/* get memory variable (var) in register (reg) */
+.macro GET_VAR var reg
+ movl \var@GOT(%ebx), \reg
+ movl (\reg), \reg
+.endm
+
+/* put register (reg) into memory variable (var) TRASH register (tmp) */
+.macro PUT_VAR reg var tmp
+ movl \var@GOT(%ebx), \tmp
+ movl \reg, (\tmp)
+.endm
+
+/* get memory variable (var) in register (reg)
+ * IF no more PIC-code is needed */
+.macro GET_1VAR var reg
+ PIC_SAVE
+ PIC_INIT
+ GET_VAR \var, \reg
+ PIC_RESTORE
+.endm
+
+/* put register (reg) into memory variable (var)
+ * IF no more PIC-code is needed */
+.macro PUT_1VAR reg var
+ PIC_SAVE
+ PIC_INIT
+ PUT_VAR \reg, \var, %ebx
+ PIC_RESTORE
+.endm
+
+#else
+
+#define PIC_SAVE
+#define PIC_RESTORE
+#define PIC_INIT
+
+.macro GET_VAR var reg
+ movl \var, \reg
+.endm
+
+.macro PUT_VAR reg var tmp
+ movl \reg, \var
+.endm
+
+.macro GET_1VAR var reg
+ GET_VAR \var, \reg
+.endm
+
+.macro PUT_1VAR reg var
+ PUT_VAR \reg, \var, none
+.endm
+
+#endif
+#endif
diff --git a/mdk-stage1/dietlibc/i386/__half.S b/mdk-stage1/dietlibc/i386/__half.S
new file mode 100644
index 000000000..6355c93e4
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/__half.S
@@ -0,0 +1,10 @@
+#
+# Definiert Konstante (float)0.5 unter dem Namen __half
+# Wird von etlichen Funktionen benutzt (sinh, cosh, atanh)
+#
+
+.global __half
+.data
+.type __half,@object
+.size __half,4
+__half: .long 0x3f000000
diff --git a/mdk-stage1/dietlibc/i386/__longjmp.S b/mdk-stage1/dietlibc/i386/__longjmp.S
index 098275037..a09191f0b 100644
--- a/mdk-stage1/dietlibc/i386/__longjmp.S
+++ b/mdk-stage1/dietlibc/i386/__longjmp.S
@@ -2,6 +2,7 @@
.text
.global __longjmp
+.type __longjmp,@function
__longjmp:
movl 4(%esp), %ecx /* User's jmp_buf in %ecx. */
movl 8(%esp), %eax /* Second argument is return value. */
diff --git a/mdk-stage1/dietlibc/i386/__ten.S b/mdk-stage1/dietlibc/i386/__ten.S
new file mode 100644
index 000000000..47b9431f4
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/__ten.S
@@ -0,0 +1,9 @@
+#
+# Definiert Konstante (float)10. unter dem Namen __ten
+#
+
+.global __ten
+.data
+.type __ten,@object
+.size __ten,4
+__ten: .long 0x41200000
diff --git a/mdk-stage1/dietlibc/i386/__testandset.S b/mdk-stage1/dietlibc/i386/__testandset.S
index af7b4d5a0..29b02d57a 100644
--- a/mdk-stage1/dietlibc/i386/__testandset.S
+++ b/mdk-stage1/dietlibc/i386/__testandset.S
@@ -1,5 +1,6 @@
.text
.global __testandset
+.type __testandset,@function
__testandset:
xorl %eax, %eax
movl 0x4(%esp),%edx
diff --git a/mdk-stage1/dietlibc/i386/accept.S b/mdk-stage1/dietlibc/i386/accept.S
new file mode 100644
index 000000000..d8be36a54
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/accept.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(accept,ACCEPT)
diff --git a/mdk-stage1/dietlibc/i386/acos.S b/mdk-stage1/dietlibc/i386/acos.S
new file mode 100644
index 000000000..baabf9f04
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/acos.S
@@ -0,0 +1,30 @@
+
+.text
+
+.global acosf,acos,acosl # ,__acos
+ .type acosf,@function
+ .type acos,@function
+ .type acosl,@function
+# .type __acos,@function
+acosf:
+ flds 4(%esp)
+ jmp __acos
+acosl:
+ fldt 4(%esp)
+ jmp __acos
+acos:
+ fldl 4(%esp)
+__acos:
+ fld %st
+ fmul %st
+ fld1
+ fsubp
+ fsqrt
+ fxch %st(1)
+ fpatan
+ ret
+
+.ende:
+.size acos,.ende-acos
+.size acosf,.ende-acosf
+.size acosl,.ende-acosl
diff --git a/mdk-stage1/dietlibc/i386/acosh.S b/mdk-stage1/dietlibc/i386/acosh.S
new file mode 100644
index 000000000..0611c9d31
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/acosh.S
@@ -0,0 +1,18 @@
+.text
+.global acosh
+.type acosh,@function
+
+acosh:
+ fldln2
+ fldl 4(%esp)
+ fld %st(0)
+ fmul %st(0),%st(0)
+ fld1
+ fsubrp %st(0),%st(1)
+ fsqrt
+ faddp %st(0),%st(1)
+ fyl2x
+ ret
+
+.Lende:
+ .size acosh,.Lende-acosh
diff --git a/mdk-stage1/dietlibc/i386/asin.S b/mdk-stage1/dietlibc/i386/asin.S
new file mode 100644
index 000000000..7b0c31407
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/asin.S
@@ -0,0 +1,29 @@
+
+.text
+
+.global asinf,asin,asinl # ,__asin
+ .type asinf,@function
+ .type asin,@function
+ .type asinl,@function
+# .type __asin,@function
+asinf:
+ flds 4(%esp)
+ jmp __asin
+asinl:
+ fldt 4(%esp)
+ jmp __asin
+asin:
+ fldl 4(%esp)
+__asin:
+ fld %st
+ fmul %st
+ fld1
+ fsubp
+ fsqrt
+ fpatan
+ ret
+
+.ende:
+.size asin,.ende-asin
+.size asinf,.ende-asinf
+.size asinl,.ende-asinl
diff --git a/mdk-stage1/dietlibc/i386/asinh.S b/mdk-stage1/dietlibc/i386/asinh.S
new file mode 100644
index 000000000..8c3964392
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/asinh.S
@@ -0,0 +1,18 @@
+.text
+.global asinh
+.type asinh,@function
+
+asinh:
+ fldln2
+ fldl 4(%esp)
+ fld %st(0)
+ fmul %st(0),%st(0)
+ fld1
+ faddp %st(0),%st(1)
+ fsqrt
+ faddp %st(0),%st(1)
+ fyl2x
+ ret
+
+.Lende:
+ .size asinh,.Lende-asinh
diff --git a/mdk-stage1/dietlibc/i386/atan.S b/mdk-stage1/dietlibc/i386/atan.S
new file mode 100644
index 000000000..76513f928
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/atan.S
@@ -0,0 +1,27 @@
+
+.text
+
+.global atanf,atan,atanl
+ .type atanf,@function
+ .type atan,@function
+ .type atanl,@function
+atanf:
+ flds 4(%esp)
+ fld1
+ fpatan
+ ret
+atan:
+ fldl 4(%esp)
+ fld1
+ fpatan
+ ret
+atanl:
+ fldt 4(%esp)
+ fld1
+ fpatan
+ ret
+
+.ende:
+.size atan,.ende-atan
+.size atanf,.ende-atanf
+.size atanl,.ende-atanl
diff --git a/mdk-stage1/dietlibc/i386/atan2.S b/mdk-stage1/dietlibc/i386/atan2.S
new file mode 100644
index 000000000..acf6e03ae
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/atan2.S
@@ -0,0 +1,12 @@
+
+.text
+.type atan2,@function
+.global atan2
+atan2:
+ fldl 4(%esp)
+ fldl 12(%esp)
+ fpatan
+ ret
+
+.ende:
+.size atan2,.ende-atan2
diff --git a/mdk-stage1/dietlibc/i386/atanh.S b/mdk-stage1/dietlibc/i386/atanh.S
new file mode 100644
index 000000000..b75f0fa8e
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/atanh.S
@@ -0,0 +1,19 @@
+.text
+.global atanh
+.type atanh,@function
+
+atanh:
+ fldln2
+ fldl 4(%esp)
+ fld1
+ fld %st(1)
+ fadd %st(1),%st(0)
+ fxch %st(1)
+ fsubp %st(0),%st(2)
+ fdivp %st(0),%st(1)
+ fyl2x
+ fmuls __half
+ ret
+
+.Lende:
+ .size atanh,.Lende-atanh
diff --git a/mdk-stage1/dietlibc/i386/atol.S b/mdk-stage1/dietlibc/i386/atol.S
new file mode 100644
index 000000000..5bd7f2c24
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/atol.S
@@ -0,0 +1,55 @@
+/*
+ Copyright (C) 2001, 2002 Thomas M. Ogrisegg
+
+ This is free software. You can redistribute and
+ modify it under the terms of the GNU General Public
+ Public License.
+
+ atol.S
+ i386 assembler implementation of atoi(3) & atol(3)
+*/
+
+.text
+.globl atoi
+.globl atol
+.type atoi,@function
+.type atol,@function
+
+atoi:
+atol:
+ pushl %esi
+ movl 0x8(%esp), %esi
+ xorl %eax, %eax
+ xorl %edx, %edx
+ xorb %cl, %cl
+.LSpace:
+ lodsb
+ cmpb $0x21, %al
+ jng .LSpace
+ cmpb $'+', %al
+ jz .Lfe5
+ cmpb $'-', %al
+ jnz .Lfe3
+ inc %cl
+ jmp .Lfe5
+.Lfe2:
+ imul $0xa, %edx
+ addl %eax, %edx
+.Lfe5:
+ lodsb
+.Lfe3:
+ cmpb $47, %al
+ jng .Lout
+ subb $('0'), %al
+ cmpb $9, %al
+ jng .Lfe2
+.Lout:
+ movl %edx, %eax
+ or %cl, %cl
+ jz .Lreturn
+ negl %eax
+.Lreturn:
+ popl %esi
+ ret
+.size atoi, . - atoi
+.size atol, . - atol
diff --git a/mdk-stage1/dietlibc/i386/atoll.S b/mdk-stage1/dietlibc/i386/atoll.S
new file mode 100644
index 000000000..093bf762a
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/atoll.S
@@ -0,0 +1,64 @@
+
+.text
+.type atoll,@function
+.global atoll
+
+atoll:
+ movl 4(%esp),%ecx
+ push %edi
+
+ xorl %edi,%edi # sign = 0
+
+ decl %ecx
+.Lspaces:
+ incl %ecx # while ( isspace(*p) ) p++;
+ movb (%ecx),%al
+ cmpb $' ',%al
+ je .Lspaces
+ subb $9,%al
+ cmpb $5,%al
+ jc .Lspaces # c = *p - 9;
+
+ cmpb $'+'-9,%al # if ( c == '+' - 9 ) p++;
+ je .Lpos
+ cmpb $'-'-9,%al # else if ( c == '-' - 9 ) sign = -sign, p++;
+ jne .Lnosign
+ decl %edi
+.Lpos: incl %ecx
+.Lnosign:
+
+ push %ebx
+ push %esi
+ push %ebp
+ movl $10,%ebp
+
+ xorl %esi,%esi # Hi(value) = 0;
+ xorl %eax,%eax # Lo(value) = 0;
+.Lcont: movzbl (%ecx),%ebx # while ( (unsigned) (*p - '0') < 10 )
+ inc %ecx
+ subl $'0',%ebx
+ cmpl %ebp,%ebx
+ jnc .Lfini
+ imull %ebp,%esi # value *= 10,
+ mull %ebp
+ addl %edx,%esi
+ addl %ebx,%eax # value += (*p - '0');
+ adcl $0,%esi
+ jmp .Lcont
+
+.Lfini: xchg %edx,%esi # return sign== 0 ? +value
+ xorl %edi,%eax # sign==-1 ? -value
+ xorl %edi,%edx
+ subl %edi,%eax
+ sbbl %edi,%edx
+
+ pop %ebp
+ pop %esi
+ pop %ebx
+ pop %edi
+ ret
+
+.Lende:
+
+.size atoll,.Lende-atoll
+
diff --git a/mdk-stage1/dietlibc/i386/bind.S b/mdk-stage1/dietlibc/i386/bind.S
new file mode 100644
index 000000000..caff9bb8b
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/bind.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(bind,BIND)
diff --git a/mdk-stage1/dietlibc/i386/cbrt.S b/mdk-stage1/dietlibc/i386/cbrt.S
new file mode 100644
index 000000000..9d8aebd1e
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/cbrt.S
@@ -0,0 +1,46 @@
+.text
+
+tab: .byte 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4
+ .byte 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9
+ .byte 10,10,11,11,12,12,12,13,13,14,14,14,15,15,15,16
+
+_3: .long 0x40400000
+
+
+.global cbrt
+cbrt:
+ fldl 4(%esp)
+ movw 10(%esp),%ax
+ movb %ah,%ch
+ andw $0x7FFF,%ax
+ jz zero /* cbrt(0) = 0 */
+ pushl %ebx
+ cwd
+ movl $16*3,%ebx /* AX 3FE0 3FF0 4000 4010 */
+ divw %bx /* AX 154 155 155 155 */
+ /* DX 20 0 10 20 */
+ shlw $5,%ax
+ addb %ch,%ch
+ rcrw %ax /* AX 1540 1550 1550 1550 */
+ addw $0x3FF0-0x1550,%ax /* AX 3FE0 3FF0 3FF0 3FF0 */
+ movw %dx,%bx
+ addb tab(%ebx),%al
+ adcb $0,%ah
+ popl %ebx
+ movw %ax,10(%esp)
+ fldl 4(%esp) /* y x */
+
+ movl $4,%ecx
+lop:
+ fld %st(0) /* y y x */
+ fmul %st(0),%st(0) /* y^2 y x */
+ fdivr %st(2),%st(0) /* x/y^2 y x */
+ fadd %st(1),%st(0) /* x/y^2+y y x */
+ faddp /* x/y^2+2y x */
+ fdivs _3 /* y' x */
+ loop lop
+
+ fstp %st(1) /* y' */
+zero:
+ ret
+
diff --git a/mdk-stage1/dietlibc/i386/ceil.S b/mdk-stage1/dietlibc/i386/ceil.S
new file mode 100644
index 000000000..e6a4e989c
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/ceil.S
@@ -0,0 +1,44 @@
+.text
+
+.global ceilf,ceil,ceill,__flcetr
+ .type ceilf,@function
+ .type ceil,@function
+ .type ceill,@function
+ .type __flcetr,@function
+
+ceilf:
+ flds 4(%esp)
+ movb $0x08,%ah
+ jmp __flcetr
+
+ceill:
+ fldt 4(%esp)
+ movb $0x08,%ah
+ jmp __flcetr
+
+ceil:
+ fldl 4(%esp)
+ movb $0x08,%ah
+
+# Wspolny kod dla funkcji floor, ceil i trunc
+# W ah maska bitow 11 i 10 rejestru sterowania koprocesora
+__flcetr:
+ xorl %ecx,%ecx # wyzerowanie rejestru
+ movb %ah,%ch # i utworzenie maski w cx
+ pushl %eax # krotsze niz subl $4,%esp
+ fstcw (%esp)
+ movw (%esp),%ax
+ andb $0x03,%ah # wyzerowanie bitow 11 i 10
+ orl %ecx,%eax # ustawienie bitow z maski
+ movw %ax,2(%esp)
+ fldcw 2(%esp)
+ frndint
+ fldcw (%esp) # odtworzenie rejestru sterowania
+ popl %eax # i polozenia stosu
+ ret
+
+.Lende:
+.size ceil,.Lende-ceil
+.size ceill,.Lende-ceill
+.size ceilf,.Lende-ceilf
+.size flcetr,.Lende-__flcetr
diff --git a/mdk-stage1/dietlibc/i386/clone.S b/mdk-stage1/dietlibc/i386/clone.S
index ac02eb468..ea43bc2e2 100644
--- a/mdk-stage1/dietlibc/i386/clone.S
+++ b/mdk-stage1/dietlibc/i386/clone.S
@@ -1,17 +1,21 @@
-#include <asm/unistd.h>
+#include "syscalls.h"
+#include <errno.h>
+#include "PIC.h"
.text
+.type clone,@function
.weak clone
clone:
+.type __clone,@function
.global __clone
__clone:
+ mov $-EINVAL, %eax
+
movl 4(%esp), %ecx /* have non null thread_funcion */
- testl %ecx, %ecx
- je .Lclone_error
+ jecxz .Lclone_error
movl 8(%esp), %ecx /* have non null child_stack pointer */
- testl %ecx, %ecx
- je .Lclone_error
+ jecxz .Lclone_error
/* put the parameter on thread stack */
subl $8, %ecx
@@ -31,9 +35,7 @@ __clone:
testl %eax, %eax
jl .Lclone_error
- je .Lstart_thread
- ret
-
+ jne .Lreturn
.Lstart_thread:
xorl %ebp,%ebp
call *%ebx
@@ -43,9 +45,16 @@ __clone:
.Lclone_error:
negl %eax
pushl %eax
+#ifdef PIC
+ pushl %ebx
+ PIC_INIT
+ call __errno_location@PLT
+ popl %ebx
+#else
call __errno_location
+#endif
popl %ecx
movl %ecx, (%eax)
- xorl %eax, %eax
- decl %eax
+ orl $-1, %eax
+.Lreturn:
ret
diff --git a/mdk-stage1/dietlibc/i386/connect.S b/mdk-stage1/dietlibc/i386/connect.S
new file mode 100644
index 000000000..a295a8814
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/connect.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(connect,CONNECT)
diff --git a/mdk-stage1/dietlibc/i386/copysign.S b/mdk-stage1/dietlibc/i386/copysign.S
new file mode 100644
index 000000000..3a495efee
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/copysign.S
@@ -0,0 +1,18 @@
+
+.text
+.type copysign,@function
+.global copysign
+
+# double copysign ( double value, double sign );
+
+copysign:
+ movb 12+7(%esp),%al
+ movb 4+7(%esp),%ah
+ andw $0x7F80,%ax
+ orb %ah,%al
+ movb 4+7(%esp),%al
+ fldl 4(%esp)
+ ret
+
+.ende:
+.size copysign,.ende-copysign
diff --git a/mdk-stage1/dietlibc/i386/cos.S b/mdk-stage1/dietlibc/i386/cos.S
new file mode 100644
index 000000000..73ba03355
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/cos.S
@@ -0,0 +1,24 @@
+.text
+
+.global cosf,cos,cosl
+.type cosf,@function
+.type cos,@function
+.type cosl,@function
+
+cosf:
+ flds 4(%esp)
+ jmp .Lcos
+cos:
+ fldl 4(%esp)
+.Lcos:
+ call __fmod2pi
+ fcos
+ ret
+cosl:
+ fldt 4(%esp)
+ jmp .Lcos
+
+.Lende:
+.size cos,.Lende-cos
+.size cosl,.Lende-cosl
+.size cosf,.Lende-cosf
diff --git a/mdk-stage1/dietlibc/i386/cosh.S b/mdk-stage1/dietlibc/i386/cosh.S
new file mode 100644
index 000000000..f6a33704d
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/cosh.S
@@ -0,0 +1,29 @@
+
+.text
+.type cosh,@function
+.global cosh
+
+cosh: # note: exp(x) = 2^(x*log2(e))
+ fldl2e
+ fmull 4(%esp) # x*log2(e)
+ fld %st(0) # x*log2(e) x*log2(e)
+ frndint # int(x*log2(e)) x*log2(e)
+ fxch # x*log2(e) int(x*log2(e))
+ fsub %st(1),%st(0) # frac(x*log2(e)) int(x*log2(e))
+ f2xm1 # 2^(fract(x*log2(e)))-1 int(x*log2(e))
+ fld1 # 1 2^(fract(x*log2(e)))-1 int(x*log2(e))
+ faddp %st(0),%st(1) # 2^(fract(x*log2(e))) int(x*log2(e))
+ fscale # 2^(x*log2(e)) int(x*log2(e))
+ fstp %st(1) # 2^(x*log2(e))
+
+# now we have y = exp(x), but cosh(x) = (y + 1/y) * 0.5
+
+ fld1
+ fdiv %st(1),%st(0)
+ faddp
+ fmuls __half
+ ret
+
+.Lende:
+
+.size cosh,.ende-cosh
diff --git a/mdk-stage1/dietlibc/i386/dyn_syscalls.S b/mdk-stage1/dietlibc/i386/dyn_syscalls.S
new file mode 100644
index 000000000..28d668b6c
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/dyn_syscalls.S
@@ -0,0 +1,283 @@
+/*
+ * dynamic unified-syscalls
+ * Olaf Dreesen
+ */
+
+#include "../syscalls.s/environ.S"
+#include "../syscalls.s/errno.S"
+
+#include <dietfeatures.h>
+#include "syscalls.h"
+#include "PIC.h"
+
+/* ok now include all syscalls.s (*.S) and sysdep *.S */
+
+#include "mmap.S"
+
+/* here on i386 I had split them some pre- some post-unified-syscall,
+ * because the jumps pre-u.s.c. have only a 1 byte displacement. the first
+ * post-u.s.c. have also 1 byte dsplacement the rest a 4 byte.
+ * this pre/post split saves about 250 byte of code ....
+ *
+ * Please put additional syscalls AFTER the post-u.s.c.
+ * or try to not break the savings :) */
+
+#include "select.S"
+
+#include "../syscalls.s/fork.S"
+#include "../syscalls.s/read.S"
+#include "../syscalls.s/write.S"
+#include "../syscalls.s/open.S"
+#include "../syscalls.s/close.S"
+#include "../syscalls.s/waitpid.S"
+
+#include "../syscalls.s/getgid.S"
+#include "../syscalls.s/getpgid.S"
+#include "../syscalls.s/getpid.S"
+#include "../syscalls.s/getppid.S"
+#include "../syscalls.s/getuid.S"
+#include "../syscalls.s/kill.S"
+#include "../syscalls.s/ioctl.S"
+#include "../syscalls.s/_llseek.S"
+#include "../syscalls.s/lseek.S"
+#include "../syscalls.s/lstat.S"
+#include "../syscalls.s/lstat64.S"
+#include "../syscalls.s/mkdir.S"
+#include "../syscalls.s/mprotect.S"
+#include "../syscalls.s/nanosleep.S"
+#include "../syscalls.s/pipe.S"
+#include "../syscalls.s/poll.S"
+#include "../syscalls.s/readv.S"
+#include "../syscalls.s/stat.S"
+#include "../syscalls.s/stat64.S"
+#include "../syscalls.s/truncate.S"
+#include "../syscalls.s/umask.S"
+#include "../syscalls.s/wait4.S"
+#include "../syscalls.s/writev.S"
+#include "../syscalls.s/__getpagesize.S"
+
+/* OK this is basicaly unified.S */
+.text
+.type __unified_syscall_256,@function
+.global __unified_syscall_256
+__unified_syscall_256:
+ movzwl %ax, %eax
+ jmp .L23
+.L22:
+.size __unified_syscall_256,.L22-__unified_syscall_256
+.type exit,@function
+.weak exit
+exit:
+.type _exit,@function
+.global _exit
+_exit:
+__exit:
+ mov $__NR_exit, %al
+__unified_syscall:
+ movzbl %al, %eax
+.L23:
+ push %edi
+ push %esi
+ push %ebx
+ movl %esp,%edi
+ movl 0x10(%edi),%ebx
+ movl 0x14(%edi),%ecx
+ movl 0x18(%edi),%edx
+ movl 0x1c(%edi),%esi
+ movl 0x20(%edi),%edi
+ int $0x80
+ cmp $-124,%eax
+ jbe .Lnoerror
+ neg %eax
+
+ /* PIC-code Ohhhhh My. */
+ push %eax
+ PIC_INIT
+ call __errno_location@PLT
+ popl %ebx
+ movl %ebx,(%eax)
+ orl $-1,%eax
+.Lnoerror:
+ pop %ebx
+ pop %esi
+ pop %edi
+#include "dietuglyweaks.h"
+ ret
+
+#include "../syscalls.s/__pread.S"
+#include "../syscalls.s/__pwrite.S"
+#include "../syscalls.s/__reboot.S"
+#include "../syscalls.s/access.S"
+#include "../syscalls.s/adjtimex.S"
+#include "../syscalls.s/brk.S"
+#include "../syscalls.s/chdir.S"
+#include "../syscalls.s/chmod.S"
+#include "../syscalls.s/chown.S"
+#include "../syscalls.s/chroot.S"
+#include "../syscalls.s/dup.S"
+#include "../syscalls.s/dup2.S"
+#include "../syscalls.s/execve.S"
+#include "../syscalls.s/fchdir.S"
+#include "../syscalls.s/fchmod.S"
+#include "../syscalls.s/fchown.S"
+#include "../syscalls.s/fcntl.S"
+#include "../syscalls.s/flock.S"
+#include "../syscalls.s/fstat.S"
+#include "../syscalls.s/fstat64.S"
+#include "../syscalls.s/fstatfs.S"
+#include "../syscalls.s/fsync.S"
+#include "../syscalls.s/fdatasync.S"
+#include "../syscalls.s/ftruncate.S"
+#include "../syscalls.s/getcwd.S"
+#include "../syscalls.s/getdents.S"
+#include "../syscalls.s/getdents64.S"
+#include "../syscalls.s/getegid.S"
+#include "../syscalls.s/geteuid.S"
+#include "../syscalls.s/getgroups.S"
+#include "../syscalls.s/getitimer.S"
+#include "../syscalls.s/getpriority.S"
+#include "../syscalls.s/getresgid.S"
+#include "../syscalls.s/getresuid.S"
+#include "../syscalls.s/getrlimit.S"
+#include "../syscalls.s/getrusage.S"
+#include "../syscalls.s/getsid.S"
+#include "../syscalls.s/gettimeofday.S"
+#include "../syscalls.s/ioperm.S"
+#include "../syscalls.s/iopl.S"
+#include "../syscalls.s/ipc.S"
+#include "../syscalls.s/lchown.S"
+#include "../syscalls.s/link.S"
+#include "../syscalls.s/mknod.S"
+#include "../syscalls.s/mlock.S"
+#include "../syscalls.s/mlockall.S"
+#include "../syscalls.s/mount.S"
+#include "../syscalls.s/mremap.S"
+#include "../syscalls.s/munlockall.S"
+#include "../syscalls.s/munmap.S"
+#include "../syscalls.s/n_sigaction.S"
+#include "../syscalls.s/n_sigpending.S"
+#include "../syscalls.s/n_sigprocmask.S"
+#include "../syscalls.s/n_sigsuspend.S"
+#include "../syscalls.s/nice.S"
+#include "../syscalls.s/pause.S"
+#include "../syscalls.s/personality.S"
+#include "../syscalls.s/query_module.S"
+#include "../syscalls.s/init_module.S"
+#include "../syscalls.s/delete_module.S"
+#include "../syscalls.s/create_module.S"
+#include "../syscalls.s/readlink.S"
+#include "../syscalls.s/rename.S"
+#include "../syscalls.s/rmdir.S"
+#include "../syscalls.s/rt_sigaction.S"
+#include "../syscalls.s/rt_sigpending.S"
+#include "../syscalls.s/rt_sigprocmask.S"
+#include "../syscalls.s/rt_sigqueueinfo.S"
+#include "../syscalls.s/rt_sigsuspend.S"
+#include "../syscalls.s/rt_sigtimedwait.S"
+#include "../syscalls.s/sched_get_priority_max.S"
+#include "../syscalls.s/sched_get_priority_min.S"
+#include "../syscalls.s/sched_getparam.S"
+#include "../syscalls.s/sched_getscheduler.S"
+#include "../syscalls.s/sched_rr_get_interval.S"
+#include "../syscalls.s/sched_setparam.S"
+#include "../syscalls.s/sched_setscheduler.S"
+#include "../syscalls.s/sched_yield.S"
+#include "../syscalls.s/sendfile.S"
+#include "../syscalls.s/setdomainname.S"
+#include "../syscalls.s/setfsgid.S"
+#include "../syscalls.s/setfsuid.S"
+#include "../syscalls.s/setgid.S"
+#include "../syscalls.s/setgroups.S"
+#include "../syscalls.s/sethostname.S"
+#include "../syscalls.s/setitimer.S"
+#include "../syscalls.s/setpgid.S"
+#include "../syscalls.s/setpriority.S"
+#include "../syscalls.s/setregid.S"
+#include "../syscalls.s/setresgid.S"
+#include "../syscalls.s/setresuid.S"
+#include "../syscalls.s/setreuid.S"
+#include "../syscalls.s/setrlimit.S"
+#include "../syscalls.s/setsid.S"
+#include "../syscalls.s/setuid.S"
+#include "../syscalls.s/sigaltstack.S"
+#include "../syscalls.s/statfs.S"
+#include "../syscalls.s/stime.S"
+#include "../syscalls.s/swapoff.S"
+#include "../syscalls.s/swapon.S"
+#include "../syscalls.s/symlink.S"
+#include "../syscalls.s/sync.S"
+#include "../syscalls.s/sysctl.S"
+#include "../syscalls.s/sysinfo.S"
+#include "../syscalls.s/syslog.S"
+#include "../syscalls.s/time.S"
+#include "../syscalls.s/times.S"
+#include "../syscalls.s/umount.S"
+#include "../syscalls.s/umount2.S"
+#include "../syscalls.s/uname.S"
+#include "../syscalls.s/unlink.S"
+#include "../syscalls.s/utime.S"
+#include "../syscalls.s/vhangup.S"
+
+#include "../syscalls.s/chown32.S"
+#include "../syscalls.s/fchown32.S"
+#include "../syscalls.s/getegid32.S"
+#include "../syscalls.s/geteuid32.S"
+#include "../syscalls.s/getgid32.S"
+#include "../syscalls.s/getgroups32.S"
+#include "../syscalls.s/getresgid32.S"
+#include "../syscalls.s/getuid32.S"
+#include "../syscalls.s/lchown32.S"
+#include "../syscalls.s/setfsgid32.S"
+#include "../syscalls.s/setfsuid32.S"
+#include "../syscalls.s/setgid32.S"
+#include "../syscalls.s/setregid32.S"
+#include "../syscalls.s/setresgid32.S"
+#include "../syscalls.s/setreuid32.S"
+#include "../syscalls.s/setuid32.S"
+#include "../syscalls.s/alarm.S"
+#include "../syscalls.s/ptrace.S"
+#include "../syscalls.s/truncate64.S"
+#include "../syscalls.s/ftruncate64.S"
+#include "../syscalls.s/epoll_create.S"
+#include "../syscalls.s/epoll_ctl.S"
+#include "../syscalls.s/epoll_wait.S"
+
+#undef __PIC__
+#undef __socketcall
+/* oh what a kludge! */
+#define socketcall .Lsocketcall
+#include "../i386/send.S"
+#include "../i386/recv.S"
+#include "../i386/socket.S"
+#include "../i386/accept.S"
+#include "../i386/shutdown.S"
+#include "../i386/socketpair.S"
+#include "../i386/setsockopt.S"
+#include "../i386/sendto.S"
+#include "../i386/sendmsg.S"
+#include "../i386/recvmsg.S"
+#include "../i386/recvfrom.S"
+#include "../i386/listen.S"
+#include "../i386/getsockopt.S"
+#include "../i386/getsockname.S"
+#include "../i386/getpeername.S"
+#include "../i386/connect.S"
+#include "../i386/bind.S"
+#undef socketcall
+.Lsocketcall:
+#include "../i386/socketcall.S"
+#define __PIC__
+#undef __socketcall
+
+
+/* so now this was the last u.s.c. */
+
+/* other asm-files ... */
+#define PIC
+
+#define _exit __exit
+#include "clone.S"
+#undef _exit
+
+#include "__longjmp.S"
+#include "setjmp.S"
diff --git a/mdk-stage1/dietlibc/i386/exp.S b/mdk-stage1/dietlibc/i386/exp.S
new file mode 100644
index 000000000..6c82128e4
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/exp.S
@@ -0,0 +1,35 @@
+.text
+
+.global expf,exp,expl,__finexp
+ .type expf,@function
+ .type exp,@function
+ .type expl,@function
+ .type __finexp,@function
+expf:
+ fldl2e
+ fmuls 4(%esp)
+ jmp __finexp
+expl:
+ fldl2e
+ fldt 4(%esp)
+ fmulp
+ jmp __finexp
+exp:
+ fldl2e
+ fmull 4(%esp)
+__finexp:
+ fst %st(1)
+ frndint
+ fst %st(2)
+ fsubrp
+ f2xm1
+ fld1
+ faddp
+ fscale
+ ret
+
+.Lende:
+.size exp,.Lende-exp
+.size expl,.Lende-expl
+.size expf,.Lende-expf
+.size __finexp,.Lende-__finexp
diff --git a/mdk-stage1/dietlibc/i386/exp10.S b/mdk-stage1/dietlibc/i386/exp10.S
new file mode 100644
index 000000000..6223e5f85
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/exp10.S
@@ -0,0 +1,27 @@
+
+.text
+.type exp10,@function
+.global exp10
+.type pow10,@function
+.global pow10
+
+
+pow10:
+exp10: # note: 10^(x) = 2^(x*log2(10))
+ fldl2t
+ fmull 4(%esp) # x*log2(10)
+ fld %st(0) # x*log2(10) x*log2(10)
+ frndint # int(x*log2(10)) x*log2(10)
+ fxch # x*log2(10) int(x*log2(10))
+ fsub %st(1),%st(0) # frac(x*log2(10)) int(x*log2(10))
+ f2xm1 # 2^(fract(x*log2(10)))-1 int(x*log2(10))
+ fld1 # 1 2^(fract(x*log2(10)))-1 int(x*log2(10))
+ faddp %st(0),%st(1) # 2^(fract(x*log2(10))) int(x*log2(10))
+ fscale # 2^(x*log2(10)) int(x*log2(10))
+ fstp %st(1) # 2^(x*log2(10))
+ ret
+
+.ende:
+
+.size exp10,.ende-exp10
+.size pow10,.ende-pow10
diff --git a/mdk-stage1/dietlibc/i386/exp2.S b/mdk-stage1/dietlibc/i386/exp2.S
new file mode 100644
index 000000000..d5389a22e
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/exp2.S
@@ -0,0 +1,18 @@
+.text
+.type exp2,@function
+.global exp2
+exp2: # note: exp2(x) = 2^x
+ fldl 4(%esp) # x
+ fld %st(0) # x x
+ frndint # int(x) x
+ fxch # x int(x)
+ fsub %st(1),%st(0) # frac(x) int(x)
+ f2xm1 # 2^(fract(x))-1 int(x)
+ fld1 # 1 2^(fract(x))-1 int(x)
+ faddp %st(0),%st(1) # 2^(fract(x)) int(x)
+ fscale # 2^x int(x)
+ fstp %st(1) # 2^x
+ ret
+
+.ende:
+.size exp2,.ende-exp2
diff --git a/mdk-stage1/dietlibc/i386/expm1.S b/mdk-stage1/dietlibc/i386/expm1.S
new file mode 100644
index 000000000..677f4723f
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/expm1.S
@@ -0,0 +1,23 @@
+.text
+.type expm1,@function
+.global expm1
+expm1: # note: exp(x) = 2^(x*log2(e))
+ fldl2e
+ fmull 4(%esp) # x*log2(e)
+ fld %st(0) # x*log2(e) x*log2(e)
+ frndint # int(x*log2(e)) x*log2(e)
+ fxch # x*log2(e) int(x*log2(e))
+ fsub %st(1),%st(0) # frac(x*log2(e)) int(x*log2(e))
+ f2xm1 # 2^(fract(x*log2(e)))-1 int(x*log2(e))
+ fscale # 2^(x*log2(e))-2^int(x*log2(e)) int(x*log2(e))
+ fxch # int(x*log2(e)) 2^(x*log2(e))-2^int(x*log2(e))
+ fld1 # 1 int(x*log2(e)) 2^(x*log2(e))-2^int(x*log2(e))
+ fscale # 2^int(x*log2(e)) int(x*log2(e)) 2^(x*log2(e))-2^int(x*log2(e))
+ fstp %st(1) # 2^int(x*log2(e)) 2^(x*log2(e))-2^int(x*log2(e))
+ fld1 # 1 2^int(x*log2(e)) 2^(x*log2(e))-2^int(x*log2(e))
+ fsubrp %st(1) # 2^int(x*log2(e))-1 2^(x*log2(e))-2^int(x*log2(e))
+ faddp %st(1)
+ ret
+
+.ende:
+.size expm1,.ende-expm1
diff --git a/mdk-stage1/dietlibc/i386/fabs.S b/mdk-stage1/dietlibc/i386/fabs.S
new file mode 100644
index 000000000..d9c1c2212
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/fabs.S
@@ -0,0 +1,11 @@
+
+.text
+.type fabs,@function
+.global fabs
+fabs:
+ fldl 4(%esp)
+ fabs
+ ret
+
+.ende:
+.size fabs,.ende-fabs
diff --git a/mdk-stage1/dietlibc/i386/floor.S b/mdk-stage1/dietlibc/i386/floor.S
new file mode 100644
index 000000000..af26d0c94
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/floor.S
@@ -0,0 +1,26 @@
+.text
+
+.global floorf,floor,floorl
+ .type floorf,@function
+ .type floor,@function
+ .type floorf,@function
+
+floorf:
+ flds 4(%esp)
+ movb $0x04,%ah
+ jmp __flcetr
+
+floor:
+ fldl 4(%esp)
+ movb $0x04,%ah
+ jmp __flcetr
+
+floorl:
+ fldt 4(%esp)
+ movb $0x04,%ah
+ jmp __flcetr
+
+.Lende:
+.size floor,.Lende-floor
+.size floorl,.Lende-floorl
+.size floorf,.Lende-floorf
diff --git a/mdk-stage1/dietlibc/i386/fmod.S b/mdk-stage1/dietlibc/i386/fmod.S
new file mode 100644
index 000000000..5bf4c06ab
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/fmod.S
@@ -0,0 +1,37 @@
+.text
+.type fmod,@function
+.type fmodf,@function
+.type fmodl,@function
+.type __fmod2pi,@function
+.global fmod, fmodl, fmodf, __fmod2pi
+
+__fmod2pi:
+ fldpi
+ fadd %st(0)
+ fxch
+ jmp .Lfmod
+
+fmodf:
+ flds 8(%esp) # y
+ flds 4(%esp) # x
+ jmp .Lfmod
+fmod:
+ fldl 12(%esp)
+ fldl 4(%esp)
+.Lfmod:
+ fprem
+ fstsw %ax
+ sahf
+ jp .Lfmod
+ ret
+
+fmodl:
+ fldt 16(%esp)
+ fldt 4(%esp)
+ jmp .Lfmod
+
+
+.ende:
+.size fmod,.ende-fmod
+.size fmodl,.ende-fmodl
+.size fmodf,.ende-fmodf
diff --git a/mdk-stage1/dietlibc/i386/getenv.S b/mdk-stage1/dietlibc/i386/getenv.S
new file mode 100644
index 000000000..dafbf37ee
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/getenv.S
@@ -0,0 +1,48 @@
+#include "PIC.h"
+
+.text
+.global getenv
+.type getenv,@function
+getenv:
+ pushl %esi
+ pushl %edi
+ movl 0xc(%esp), %edi
+ cld
+ movl %edi, %edx
+ xorl %eax, %eax
+ leal -1(%eax), %ecx
+ repnz scasb
+ not %ecx
+ dec %ecx
+ pushl %ecx
+ movl (%edx), %ecx
+
+ GET_1VAR environ, %esi # non-PIC: movl environ, %esi
+ jmp .Lloop
+
+.Lprepare:
+ movl (%edx), %ecx
+ movl %eax, %esi
+.Lloop:
+ lodsl
+ or %eax, %eax
+ jz .Lout
+ cmpb %cl, (%eax)
+ jnz .Lloop
+
+ movl %edx, %edi
+ xchg %esi, %eax
+ movl (%esp), %ecx
+ repz cmpsb
+ jne .Lprepare
+ or %ecx, %ecx
+ jnz .Lprepare
+ cmpb $'=', (%esi)
+ jne .Lprepare
+ leal 0x1(%esi), %eax
+.Lout:
+ popl %ecx
+ popl %edi
+ popl %esi
+ ret
+.size getenv, . - getenv
diff --git a/mdk-stage1/dietlibc/i386/getpeername.S b/mdk-stage1/dietlibc/i386/getpeername.S
new file mode 100644
index 000000000..833322941
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/getpeername.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(getpeername,GETPEERNAME)
diff --git a/mdk-stage1/dietlibc/i386/getsockname.S b/mdk-stage1/dietlibc/i386/getsockname.S
new file mode 100644
index 000000000..f0618481c
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/getsockname.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(getsockname,GETSOCKNAME)
diff --git a/mdk-stage1/dietlibc/i386/getsockopt.S b/mdk-stage1/dietlibc/i386/getsockopt.S
new file mode 100644
index 000000000..23d7c2470
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/getsockopt.S
@@ -0,0 +1,4 @@
+#include <linuxnet.h>
+#include <syscalls.h>
+
+__socketcall(getsockopt,GETSOCKOPT)
diff --git a/mdk-stage1/dietlibc/i386/htonl.S b/mdk-stage1/dietlibc/i386/htonl.S
new file mode 100644
index 000000000..f3732d16a
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/htonl.S
@@ -0,0 +1,13 @@
+.text
+.global htonl
+.type htonl,@function
+.global ntohl
+.type ntohl,@function
+
+htonl:
+ntohl:
+ movl 4(%esp),%eax
+ xchgb %al,%ah
+ rorl $16,%eax
+ xchgb %al,%ah
+ ret
diff --git a/mdk-stage1/dietlibc/i386/htons.S b/mdk-stage1/dietlibc/i386/htons.S
new file mode 100644
index 000000000..367d6d03c
--- /dev/null
+++ b/mdk-stage1/dietlibc/i386/htons.S
@@ -0,0 +1,11 @@
+.text
+.global htons
+.type htons,@function
+.global ntohs
+.type ntohs,@function
+
+htons:
+ntohs:
+ movzwl 4(%esp),%eax
+ xchgb %al,%ah
+ ret
diff --git a/mdk-stage1/dietlibc/linuxnet.h b/mdk-stage1/dietlibc/linuxnet.h
new file mode 100644
index 000000000..8e2204701
--- /dev/null
+++ b/mdk-stage1/dietlibc/linuxnet.h
@@ -0,0 +1,19 @@
+
+#define SYS_SOCKET 1 /* sys_socket(2) */
+#define SYS_BIND 2 /* sys_bind(2) */
+#define SYS_CONNECT 3 /* sys_connect(2) */
+#define SYS_LISTEN 4 /* sys_listen(2) */
+#define SYS_ACCEPT 5 /* sys_accept(2) */
+#define SYS_GETSOCKNAME 6 /* sys_getsockname(2) */
+#define SYS_GETPEERNAME 7 /* sys_getpeername(2) */
+#define SYS_SOCKETPAIR 8 /* sys_socketpair(2) */
+#define SYS_SEND 9 /* sys_send(2) */
+#define SYS_RECV 10 /* sys_recv(2) */
+#define SYS_SENDTO 11 /* sys_sendto(2) */
+#define SYS_RECVFROM 12 /* sys_recvfrom(2) */
+#define SYS_SHUTDOWN 13 /* sys_shutdown(2) */
+#define SYS_SETSOCKOPT 14 /* sys_setsockopt(2) */
+#define SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */
+#define SYS_SENDMSG 16 /* sys_sendmsg(2) */
+#define SYS_RECVMSG 17 /* sys_recvmsg(2) */
+
diff --git a/mdk-stage1/dietlibc/parselib.h b/mdk-stage1/dietlibc/parselib.h
new file mode 100644
index 000000000..831d9da2b
--- /dev/null
+++ b/mdk-stage1/dietlibc/parselib.h
@@ -0,0 +1,23 @@
+/* parse lib: parse mmapped text with \n terminated lines */
+
+/* a memory buffer. */
+struct state {
+ const unsigned char* buffirst;/* pointer to the buffer */
+ size_t buflen; /* length of the buffer */
+ size_t cur; /* already parsed bytes */
+};
+
+/* open and mmap file, fill in struct state */
+void __prepare_parse(const char* filename,struct state* s);
+/* unmap file */
+void __end_parse(struct state* s);
+
+/* return the length of the matching string, 0 on error */
+/* match while pred returns nonzero */
+size_t __parse(struct state* s,int (*pred)(int ch));
+
+size_t __parse_ws(struct state* s); /* skip ' ' or '\t', break at '\n' or '#' */
+size_t __parse_nws(struct state* s); /* skip non-whitespace, break at '\n' or '#' */
+size_t __parse_1(struct state* s,char c); /* skip to c */
+
+size_t scan_ulong(const char* s,unsigned long* l);
diff --git a/mdk-stage1/dietlibc/start.h b/mdk-stage1/dietlibc/start.h
deleted file mode 100644
index 7f9e6be28..000000000
--- a/mdk-stage1/dietlibc/start.h
+++ /dev/null
@@ -1,14 +0,0 @@
-.section ".bss"
-.align 8
-
-.weak errno
-errno:
-.global __errno
-__errno:
- .long 0
-
-.weak environ
-environ:
-.global __environ
-__environ:
- .long 0
diff --git a/mdk-stage1/dietlibc/syscalls.h b/mdk-stage1/dietlibc/syscalls.h
index eba7a3c00..aa62f67a9 100644
--- a/mdk-stage1/dietlibc/syscalls.h
+++ b/mdk-stage1/dietlibc/syscalls.h
@@ -1,142 +1,35 @@
-#ifdef __ASSEMBLER__
+#if defined(__i386__)
+#include "i386/syscalls.h"
-#include <asm/unistd.h>
+#elif defined(__x86_64__)
+#include "x86_64/syscalls.h"
+#elif defined(__sparc__)
+#if defined(__arch64__)
+#include "sparc64/syscalls.h"
#else
-
-#include <linux/unistd.h>
-
-#endif
-
-#ifdef __i386__
-
-#define syscall_weak(name,wsym,sym) \
-.text; \
-.weak wsym; \
-wsym: ; \
-.global sym; \
-sym: \
- movb $__NR_##name,%al; \
- jmp __unified_syscall
-
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-sym: \
- movb $__NR_##name,%al; \
- jmp __unified_syscall
-
+#include "sparc/syscalls.h"
#endif
-#ifdef __sparc__
-
-#define syscall_weak(name,wsym,sym) \
-.text; \
-.weak wsym; \
-wsym: ; \
-.global sym; \
-sym: \
- b __unified_syscall; \
- mov __NR_##name, %g1
-
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-sym: \
- b __unified_syscall; \
- mov __NR_##name, %g1
-
-#endif
-
-#ifdef __powerpc__
-
-#define syscall_weak(name,wsym,sym) \
-.text; \
-.weak wsym; \
-wsym: ; \
-.global sym; \
-sym: \
- li 0,__NR_##name; \
- b __unified_syscall
+#elif defined(__powerpc__)
+#include "ppc/syscalls.h"
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-sym: \
- li 0,__NR_##name; \
- b __unified_syscall
+#elif defined(__mips__)
+#include "mips/syscalls.h"
-#endif
-
-
-#ifdef __mips__
-
-#define syscall_weak(name,wsym,sym) \
-.text; \
-.weak wsym; \
-wsym: ; \
-.global sym; \
-.ent sym; \
-sym: \
- li $2,__NR_##name; \
- la $25,__unified_syscall; \
- jr $25; \
-.end sym
-
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-.ent sym; \
-sym: \
- li $2,__NR_##name; \
- la $25,__unified_syscall; \
- jr $25; \
-.end sym
-
-#endif
-
-#ifdef __arm__
-
-#define syscall_weak(name,wsym,sym) \
-.text; \
-.weak wsym; \
-wsym: ; \
-.global sym; \
-sym: \
- swi __NR_##name; \
- b __unified_syscall
-
-#define syscall(name,sym) \
-.text; \
-.global sym; \
-sym: \
- swi __NR_##name; \
- b __unified_syscall
-
-#endif
+#elif defined(__arm__)
+#include "arm/syscalls.h"
+#elif defined(__s390__)
+#include "s390/syscalls.h"
-#ifdef __alpha__
+#elif defined(__alpha__)
+#include "alpha/syscalls.h"
-#define syscall_weak(name,wsym,sym) \
-.text ; \
-.align 2 ; \
-.weak wsym; \
-.type wsym,@function ; \
-wsym: ; \
-.global sym ; \
-.type sym,@function ; \
-sym: ; \
- lda $0, __NR_##name($31) ; \
- br __unified_syscall
+#elif defined(__hppa__)
+#include "parisc/syscalls.h"
-#define syscall(name,sym) \
-.text ; \
-.align 2 ; \
-.global sym ; \
-.type sym,@function ; \
-sym: ; \
- lda $0, __NR_##name($31) ; \
- br __unified_syscall
+#elif defined(__ia64__)
+#include "ia64/syscalls.h"
#endif
diff --git a/mdk-stage1/dietlibc/threadsafe.sh b/mdk-stage1/dietlibc/threadsafe.sh
new file mode 100755
index 000000000..67f6f6338
--- /dev/null
+++ b/mdk-stage1/dietlibc/threadsafe.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+(gcc -E - << EOF | grep -q WANT_THREAD_SAFE) || echo libpthread/pthread_*.c
+#include "dietfeatures.h"
+WANT_THREAD_SAFE
+EOF