aboutsummaryrefslogtreecommitdiffstats
path: root/packages/uclibc/uclibc-0.9.27
diff options
context:
space:
mode:
authorJohn Bowler <jbowler@nslu2-linux.org>2005-08-14 06:07:44 +0000
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>2005-08-14 06:07:44 +0000
commit98318c22a913b1500564268e3c499dc57cc036e0 (patch)
treef45374265f144b31b15051b7b229120039fa23ee /packages/uclibc/uclibc-0.9.27
parentcc49ea85bdc9b42f77b3c01f950b179e56bf8f2f (diff)
downloadopenembedded-98318c22a913b1500564268e3c499dc57cc036e0.tar.gz
Fix uclibc thumb support - with these patches and by disabling the ARM
specific string asm in uclibc it is possible to run at least some thumb executables on ucslugc. The changes can be incorporated into other distros by setting thumb-interwork in OVERRIDES - the changes do change the way ARM code executes (necessarily). (Changes have also been submitted as bug 385 to uclibc.org).
Diffstat (limited to 'packages/uclibc/uclibc-0.9.27')
-rw-r--r--packages/uclibc/uclibc-0.9.27/thumb-interwork-asm.patch326
-rw-r--r--packages/uclibc/uclibc-0.9.27/thumb-ldso-dlboot.patch21
-rw-r--r--packages/uclibc/uclibc-0.9.27/thumb-static-main.patch60
-rw-r--r--packages/uclibc/uclibc-0.9.27/ucslugc/.mtn2git_empty0
-rw-r--r--packages/uclibc/uclibc-0.9.27/ucslugc/uClibc.config160
5 files changed, 567 insertions, 0 deletions
diff --git a/packages/uclibc/uclibc-0.9.27/thumb-interwork-asm.patch b/packages/uclibc/uclibc-0.9.27/thumb-interwork-asm.patch
new file mode 100644
index 0000000000..bc99f9a5db
--- /dev/null
+++ b/packages/uclibc/uclibc-0.9.27/thumb-interwork-asm.patch
@@ -0,0 +1,326 @@
+--- uClibc-0.9.27/ldso/include/dl-elf.h 2005-01-11 23:59:21.000000000 -0800
++++ uClibc-0.9.27/ldso/include/dl-elf.h 2005-08-12 18:24:43.000000000 -0700
+@@ -112,6 +112,13 @@
+ # define ELF_RTYPE_CLASS_COPY (0x2)
+ #endif
+ #define ELF_RTYPE_CLASS_PLT (0x1)
++/* The type class can be qualified by a list (mask) of the acceptable
++ * STT_ symbol types, if not given the default is everything numerically
++ * <= STT_FUNC (from the original code...)
++ */
++#define ELF_RTYPE_CLASS_OF(type) ((1<<2) << (type))
++#define ELF_RTYPE_CLASS_ALL (0xffff << 2)
++#define ELF_RTYPE_CLASS_DEFAULT (((ELF_RTYPE_CLASS_OF(STT_FUNC) << 1) - 1)&ELF_RTYPE_CLASS_ALL)
+
+
+ /* Convert between the Linux flags for page protections and the
+--- uClibc-0.9.27/ldso/ldso/arm/resolve.S 2005-01-11 23:59:21.000000000 -0800
++++ uClibc-0.9.27/ldso/ldso/arm/resolve.S 2005-08-13 15:08:27.523344709 -0700
+@@ -1,43 +1,117 @@
+ /*
+- * This function is _not_ called directly. It is jumped to (so no return
+- * address is on the stack) when attempting to use a symbol that has not yet
+- * been resolved. The first time a jump symbol (such as a function call inside
+- * a shared library) is used (before it gets resolved) it will jump here to
+- * _dl_linux_resolve. When we get called the stack looks like this:
+- * reloc_entry
+- * tpnt
+- *
+- * This function saves all the registers, puts a copy of reloc_entry and tpnt
+- * on the stack (as function arguments) then make the function call
+- * _dl_linux_resolver(tpnt, reloc_entry). _dl_linux_resolver() figures out
+- * where the jump symbol is _really_ supposed to have jumped to and returns
+- * that to us. Once we have that, we overwrite tpnt with this fixed up
+- * address. We then clean up after ourselves, put all the registers back how we
+- * found them, then we jump to the fixed up address, which is where the jump
+- * symbol that got us here really wanted to jump to in the first place.
+- * -Erik Andersen
++ * On ARM the PLT contains the following three instructions (for ARM calls):
++ *
++ * add ip, pc, #0xNN00000
++ * add ip, ip, #0xNN000
++ * ldr pc, [ip, #0xNNN]!
++ *
++ * So that, effectively, causes the following to happen:
++ *
++ * ip := pc+0x0NNNNNNN
++ * pc := *ip
++ *
++ * For thumb the above fragment is preceded by "bx pc, nop" to switch to ARM
++ * mode and the thumb 'bl' must go to PLT-4 - the PLT entry is expanded by
++ * four bytes to accomodate the trampoline code.
++ *
++ * 0x0NNNNNNN is the offset of the GOT entry for this function relative to
++ * the PLT entry for this function (where the code is). So the code in the
++ * PLT causes a branch to whatever is in the GOT, leaving the actual address
++ * of the GOT entry in ip. (Note that the GOT must follow the PLT - the
++ * added value is 28 bit unsigned).
++ *
++ * ip is a pointer to the GOT entry for this function, the first time round
++ * *ip points to this code:
++ *
++ * str lr, [sp, #-4]! @ save lr
++ * ldr lr, [pc, #4] @ lr := *dat (&GOT_TABLE[0]-.)
++ * add lr, pc, lr @ lr += &dat (so lr == &GOT_TABLE[0])
++ * ldr pc, [lr, #8]! @ pc := GOT_TABLE[2]
++ *dat: .long &GOT_TABLE[0] - .
++ *
++ * (this code is actually held in the first entry of the PLT). The code
++ * preserves lr then uses it as a scratch register (this preserves the ip
++ * value calculated above). GOT_TABLE[2] is initialized by INIT_GOT in
++ * dl-sysdep.h to point to _dl_linux_resolve - this function. The first
++ * three entries in the GOT are reserved, then they are followed by the
++ * entries for the PLT entries, in order.
++ *
++ * The linker initialises the following (non-reserved) GOT entries to
++ * the offset of the PLT with an associated relocation so that on load
++ * the entry is relocated to point to the PLT - the above code.
++ *
++ * The net effect of all this is that on the first call to an external (as
++ * yet unresolved) function all seven of the above instructions are
++ * executed in sequence and the program ends up executing _dl_linux_resolve
++ * with the following important values in registers:
++ *
++ * ip - a pointer to the GOT entry for the as yet unresolved function
++ * lr - &GOT_TABLE[2]
++ *
++ * GOT_TABLE[2] has already been initialised to _dl_linux_resolve, and
++ * GOT_TABLE[1] is a pointer to the (elf_resolve*) from INIT_GOT.
++ * _dl_linux_resolve unfrobnicates the ip and lr values to obtain arguments
++ * for a call to _dl_linux_resolver (not the additional 'r' on the end) -
++ * this is in elfinterp.c in this directory. The call takes arguments:
++ *
++ * _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
++ *
++ * And returns the address of the function, it also overwrites the GOT
++ * table entry so that the next time round only the first code fragment will
++ * be executed - it will call the function directly.
++ *
++ * [[Of course, this simply doesn't work on ARM 4T with a thumb target - because
++ * 4T did not do the thumb/arm change on ldr pc! It can be made to work by
++ * changing _dl_linux_resolver to return __%s_from_arm for an STT_TFUNC, but
++ * this hasn't been done, and there is no guarantee that the linker generated
++ * that glue anyway.]]
++ *
++ * _dl_linux_resolve gets the arguments to call the resolver as follows:
++ *
++ * tpnt GOT_TABLE[1], [lr-4]
++ * reloc-entry &GOT-&GOT_TABLE[3], (ip - lr - 4)/4
++ *
++ * (I.e. 'GOT' means the table entry for this function, the thing for which
++ * ip holds the address.) The reloc-entry is passed as an index, since
++ * since the GOT table has 4 byte entries the code needs to divide this by 4
++ * to get the actual index.
++ *
++ * John Bowler, August 13, 2005 - determined by experiment and examination
++ * of generated ARM code (there was no documentation...)
++ *
++ * This code is all ARM code - not thumb - _dl_linux_resolver may, itself,
++ * be thumb, in which case the linker will insert the appropriate glue. A
++ * call from thumb to the PLT hits the trampoline code described above.
++ * This code (now) builds a proper stack frame.
++ *
++ * The code does *not* set sb (r9,v6) - to do that the basic PLT instructions
++ * would need to save sb and load the new value and that would require
++ * support in the linker since it generates those instructions. (Also note
++ * that linux/uclibc seems to be using r10 - sl - as a PIC base register - see
++ * dl-startup.c).
+ */
+
+-#define sl r10
+-#define fp r11
+-#define ip r12
+-
+ .text
+ .globl _dl_linux_resolve
+ .type _dl_linux_resolve,%function
+ .align 4;
+
+ _dl_linux_resolve:
+- stmdb sp!, {r0, r1, r2, r3, sl, fp}
+- sub r1, ip, lr
+- sub r1, r1, #4
+- add r1, r1, r1
+- ldr r0, [lr, #-4]
+- mov r3,r0
++ @ _dl_linux_resolver is a standard subroutine call, therefore it
++ @ preserves everything except r0-r3 (a1-a4), ip and lr. This
++ @ function must branch to the real function, and that expects
++ @ r0-r3 and lr to be as they were before the whole PLT stuff -
++ @ ip can be trashed.
++ stmdb sp!, {r0-r3}
++ ldr r0, [lr, #-4] @ r0 := [lr-4] (GOT_TABLE[1])
++ sub r1, lr, ip @ r1 := (lr-ip) (a multple of 4)
++ mvn r1, r1, ASR #2 @ r1 := ~((lr-ip)>>2), since -x = (1+~x)
++ @ ~x = -x-1, therefore ~(r1>>2) = (-((lr-ip)>>2)-1)
++ @ = - ((lr-ip)/4) - 1 = (ip - lr - 4)/4, as required
+
+ bl _dl_linux_resolver
+
+- mov ip, r0
+- ldmia sp!, {r0, r1, r2, r3, sl, fp, lr}
+- mov pc,ip
++ mov ip, r0
++ ldmia sp!, {r0-r3, lr}
++ bx ip
+ .size _dl_linux_resolve, .-_dl_linux_resolve
+--- uClibc-0.9.27/ldso/ldso/arm/elfinterp.c 2005-01-11 23:59:21.000000000 -0800
++++ uClibc-0.9.27/ldso/ldso/arm/elfinterp.c 2005-08-13 16:08:19.061345947 -0700
+@@ -128,7 +128,7 @@
+
+ rel_addr = (ELF_RELOC *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
+
+- this_reloc = rel_addr + (reloc_entry >> 3);
++ this_reloc = rel_addr + reloc_entry;
+ reloc_type = ELF32_R_TYPE(this_reloc->r_info);
+ symtab_index = ELF32_R_SYM(this_reloc->r_info);
+
+@@ -149,13 +149,20 @@
+ got_addr = (char **) instr_addr;
+
+ /* Get the address of the GOT entry */
+- new_addr = _dl_find_hash(symname, tpnt->symbol_scope,
+- tpnt, ELF_RTYPE_CLASS_PLT);
+- if (unlikely(!new_addr)) {
+- _dl_dprintf(2, "%s: can't resolve symbol '%s'\n",
+- _dl_progname, symname);
+- _dl_exit(1);
+- };
++ new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt,
++ ELF_RTYPE_CLASS_PLT+ELF_RTYPE_CLASS_OF(STT_FUNC));
++ if (!new_addr) {
++ new_addr = _dl_find_hash(symname, tpnt->symbol_scope, tpnt,
++ ELF_RTYPE_CLASS_PLT+ELF_RTYPE_CLASS_OF(STT_ARM_TFUNC));
++ if (new_addr) {
++ /* Fix up the address for thumb. */
++ new_addr = (char*)((unsigned long)new_addr | 1);
++ } else {
++ _dl_dprintf(2, "%s: can't resolve symbol '%s'\n",
++ _dl_progname, symname);
++ _dl_exit(1);
++ }
++ }
+ #if defined (__SUPPORT_LD_DEBUG__)
+ if ((unsigned long) got_addr < 0x40000000)
+ {
+@@ -278,7 +285,8 @@
+ if (symtab_index) {
+
+ symbol_addr = (unsigned long) _dl_find_hash(strtab + symtab[symtab_index].st_name,
+- scope, tpnt, elf_machine_type_class(reloc_type));
++ scope, tpnt, elf_machine_type_class(reloc_type) +
++ ELF_RTYPE_CLASS_DEFAULT + ELF_RTYPE_CLASS_OF(STT_ARM_TFUNC));
+
+ /*
+ * We want to allow undefined references to weak symbols - this might
+--- uClibc-0.9.27/ldso/ldso/dl-hash.c 2005-01-11 23:59:21.000000000 -0800
++++ uClibc-0.9.27/ldso/ldso/dl-hash.c 2005-08-12 18:28:05.000000000 -0700
+@@ -148,7 +148,11 @@
+ char *weak_result = NULL;
+
+ elf_hash_number = _dl_elf_hash(name);
+-
++ /* The type class argument may specify the valid symbol types, if not
++ * any type <= STT_FUNC is permitted.
++ */
++ if ((type_class & ELF_RTYPE_CLASS_ALL) == 0)
++ type_class += ELF_RTYPE_CLASS_DEFAULT;
+ for (; rpnt; rpnt = rpnt->next) {
+ tpnt = rpnt->dyn;
+
+@@ -178,13 +182,16 @@
+ for (si = tpnt->elf_buckets[hn]; si != STN_UNDEF; si = tpnt->chains[si]) {
+ sym = &symtab[si];
+
++ /*... nb, ELF_RTYPE_CLASS_PLT is, must be, "1" - at least
++ * it must be for the following to work.
++ */
+ if (type_class & (sym->st_shndx == SHN_UNDEF))
+ continue;
+- if (_dl_strcmp(strtab + sym->st_name, name) != 0)
+- continue;
+ if (sym->st_value == 0)
+ continue;
+- if (ELF32_ST_TYPE(sym->st_info) > STT_FUNC)
++ if ((ELF_RTYPE_CLASS_OF(ELF32_ST_TYPE(sym->st_info)) & type_class) == 0)
++ continue;
++ if (_dl_strcmp(strtab + sym->st_name, name) != 0)
+ continue;
+
+ switch (ELF32_ST_BIND(sym->st_info)) {
+--- uClibc-0.9.27/libc/sysdeps/linux/arm/clone.S 2005-01-11 23:59:21.000000000 -0800
++++ uClibc-0.9.27/libc/sysdeps/linux/arm/clone.S 2005-08-13 11:56:47.275679748 -0700
+@@ -49,12 +49,13 @@
+ swi __NR_clone
+ movs a1, a1
+ blt __syscall_error (PLT)
+- movne pc, lr
++ bxne lr
+
+ @ pick the function arg and call address off the stack and execute
+ ldr r0, [sp, #4]
++ ldr ip, [sp]
+ mov lr, pc
+- ldr pc, [sp]
++ bx ip
+
+ @ and we are done, passing the return value through r0
+ b _exit (PLT)
+@@ -70,7 +71,7 @@
+
+ /* return -1 */
+ mvn r0, $0
+- mov pc, lr
++ bx lr
+ .size __clone,.-__clone;
+
+ .L4: .word errno
+--- uClibc-0.9.27/libc/sysdeps/linux/arm/mmap64.S 2005-01-11 23:59:21.000000000 -0800
++++ uClibc-0.9.27/libc/sysdeps/linux/arm/mmap64.S 2005-08-13 12:20:35.633560643 -0700
+@@ -44,7 +44,7 @@
+ mov ip, r0
+ swi __NR_mmap2
+ cmn r0, $4096
+- ldmccfd sp!, {r4, r5, pc}
++ ldmccfd sp!, {r4, r5, pc} @ requires >=5T
+ cmn r0, $ENOSYS
+ ldmnefd sp!, {r4, r5, lr}
+ bne __syscall_error (PLT)
+@@ -71,7 +71,7 @@
+
+ /* return -1 */
+ mvn r0, $0
+- mov pc, lr
++ bx lr
+ .size mmap64,.-mmap64;
+
+ .L4: .word errno
+--- uClibc-0.9.27/libc/sysdeps/linux/arm/vfork.S 2005-01-11 23:59:21.000000000 -0800
++++ uClibc-0.9.27/libc/sysdeps/linux/arm/vfork.S 2005-08-13 12:23:27.500375540 -0700
+@@ -37,7 +37,7 @@
+ #ifdef __NR_vfork
+ swi __NR_vfork
+ cmn r0, #4096
+- movcc pc, lr
++ bxcc lr
+
+ /* Check if vfork even exists. */
+ ldr r1, =-ENOSYS
+@@ -50,7 +50,7 @@
+ cmn r0, #4096
+
+ /* Syscal worked. Return to child/parent */
+- movcc pc, lr
++ bxcc lr
+
+ __syscall_error:
+
+@@ -64,7 +64,7 @@
+
+ /* return -1 */
+ mvn r0, $0
+- mov pc, lr
++ bx lr
+
+ .L4: .word errno
+
diff --git a/packages/uclibc/uclibc-0.9.27/thumb-ldso-dlboot.patch b/packages/uclibc/uclibc-0.9.27/thumb-ldso-dlboot.patch
new file mode 100644
index 0000000000..9d3cb6bbab
--- /dev/null
+++ b/packages/uclibc/uclibc-0.9.27/thumb-ldso-dlboot.patch
@@ -0,0 +1,21 @@
+--- /home/work-tmp/jbowler/nslu2/ucslugc.0807/work/uclibc-0.9.27-r5/uClibc-0.9.27/ldso/ldso/arm/dl-startup.h 2005-01-11 23:59:21.000000000 -0800
++++ uClibc-0.9.27/ldso/ldso/arm/dl-startup.h 2005-08-11 23:40:01.393797745 -0700
+@@ -7,6 +7,9 @@
+
+ /* Overrive the default _dl_boot function, and replace it with a bit of asm.
+ * Then call the real _dl_boot function, which is now named _dl_boot2. */
++/*NOTE: the 'bx' instruction at the end replaces mov pc, r6 - which is not
++ * compatible with thumb interworking. The instruction should be supported
++ * on all modern ARM architectures (because they all support thumb). */
+ asm("" \
+ " .text\n" \
+ " .globl _dl_boot\n" \
+@@ -17,7 +20,7 @@
+ " bl _dl_boot2\n" \
+ " mov r6, r0\n" \
+ " mov r0, r7\n" \
+-" mov pc, r6\n" \
++" bx r6\n" \
+ );
+
+ #define DL_BOOT(X) static __attribute_used__ void* _dl_boot2 (X)
diff --git a/packages/uclibc/uclibc-0.9.27/thumb-static-main.patch b/packages/uclibc/uclibc-0.9.27/thumb-static-main.patch
new file mode 100644
index 0000000000..5b82f39bbf
--- /dev/null
+++ b/packages/uclibc/uclibc-0.9.27/thumb-static-main.patch
@@ -0,0 +1,60 @@
+# This patch almost works, it allows a statically linked application
+# to be compiled with a thumb main and to have this work from a
+# non-thumb uClibc build. However it stops the same thing working
+# in the dynamically linked case (because the value of 'main' doesn't
+# have the low bit set when loaded - something must be wrong with the
+# relocation for STT_ARM_TFUNC?) At present it is not included for
+# this reason.
+--- uClibc-0.9.27/libc/misc/internals/__uClibc_main.c 2005-08-13 18:04:09.078682965 -0700
++++ uClibc-0.9.27/libc/misc/internals/__uClibc_main.c 2005-08-13 18:07:38.159839613 -0700
+@@ -32,6 +32,13 @@
+ /*
+ * Prototypes.
+ */
++#if (defined __arm__ || defined __thumb__) && defined __THUMB_INTERWORK__ && defined __linux__
++/* Because when linking statically the GNU linker provides no glue for
++ * main, so if main is thumb and we are arm or vice versa the static
++ * link fails.
++ */
++# define main __arm_main
++#endif
+ extern int main(int argc, char **argv, char **envp);
+ extern void weak_function _stdio_init(void);
+ extern int *weak_const_function __errno_location(void);
+--- uClibc-0.9.27/libc/sysdeps/linux/arm/Makefile 2005-01-11 23:59:21.000000000 -0800
++++ uClibc-0.9.27/libc/sysdeps/linux/arm/Makefile 2005-08-13 18:08:08.953777353 -0700
+@@ -25,7 +25,7 @@
+ CTOR_TARGETS=$(TOPDIR)lib/crti.o $(TOPDIR)lib/crtn.o
+
+ SSRC=__longjmp.S vfork.S clone.S setjmp.S bsd-setjmp.S \
+- bsd-_setjmp.S sigrestorer.S mmap64.S
++ bsd-_setjmp.S sigrestorer.S mmap64.S mainglue.S
+ SOBJS=$(patsubst %.S,%.o, $(SSRC))
+
+ CSRC=brk.c syscall.c ioperm.c sigaction.c
+--- uClibc-0.9.27/.pc/thumb-static-main.patch/libc/sysdeps/linux/arm/mainglue.S 2005-08-13 18:20:44.181300825 -0700
++++ uClibc-0.9.27/libc/sysdeps/linux/arm/mainglue.S 2005-08-13 19:11:05.031390937 -0700
+@@ -0,0 +1,23 @@
++/*
++ * Apparently the GNU linker doesn't generate the 'glue' code
++ * required for ARM/thumb interwork for the 'main' function -
++ * presumably glibc doesn't need it, but uClibc does.
++ *
++ * We can't provide this stuff, because the linker expects to
++ * have generated the glue code itself and asserts if the code
++ * is not in memory (because it has been read from a pre-existing
++ * definition), therefore we must avoid the glue - so we make
++ * __uClibc_main call __arm_main and define it here (in arm
++ * code).
++ */
++#if defined __THUMB_INTERWORK__
++ .text
++ .arm
++ .global __arm_main
++ .type __arm_main, %function
++__arm_main:
++ ldr ip, [pc]
++ bx ip
++ .word main
++ .size __arm_main,.-__arm_main
++#endif
diff --git a/packages/uclibc/uclibc-0.9.27/ucslugc/.mtn2git_empty b/packages/uclibc/uclibc-0.9.27/ucslugc/.mtn2git_empty
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/packages/uclibc/uclibc-0.9.27/ucslugc/.mtn2git_empty
diff --git a/packages/uclibc/uclibc-0.9.27/ucslugc/uClibc.config b/packages/uclibc/uclibc-0.9.27/ucslugc/uClibc.config
new file mode 100644
index 0000000000..7c8196e93b
--- /dev/null
+++ b/packages/uclibc/uclibc-0.9.27/ucslugc/uClibc.config
@@ -0,0 +1,160 @@
+#
+# Automatically generated make config: don't edit
+#
+# TARGET_alpha is not set
+TARGET_arm=y
+# TARGET_bfin is not set
+# TARGET_cris is not set
+# TARGET_e1 is not set
+# TARGET_frv is not set
+# TARGET_h8300 is not set
+# TARGET_i386 is not set
+# TARGET_i960 is not set
+# TARGET_m68k is not set
+# TARGET_microblaze is not set
+# TARGET_mips is not set
+# TARGET_nios is not set
+# TARGET_nios2 is not set
+# TARGET_powerpc is not set
+# TARGET_sh is not set
+# TARGET_sparc is not set
+# TARGET_v850 is not set
+
+#
+# Target Architecture Features and Options
+#
+HAVE_ELF=y
+ARCH_SUPPORTS_LITTLE_ENDIAN=y
+TARGET_ARCH="arm"
+ARCH_SUPPORTS_BIG_ENDIAN=y
+CONFIG_GENERIC_ARM=y
+# CONFIG_ARM610 is not set
+# CONFIG_ARM710 is not set
+# CONFIG_ARM720T is not set
+# CONFIG_ARM920T is not set
+# CONFIG_ARM922T is not set
+# CONFIG_ARM926T is not set
+# CONFIG_ARM_SA110 is not set
+# CONFIG_ARM_SA1100 is not set
+# CONFIG_ARM_XSCALE is not set
+# ARCH_LITTLE_ENDIAN is not set
+ARCH_BIG_ENDIAN=y
+# ARCH_HAS_NO_MMU is not set
+ARCH_HAS_MMU=y
+UCLIBC_HAS_FLOATS=y
+# HAS_FPU is not set
+UCLIBC_HAS_SOFT_FLOAT=y
+DO_C99_MATH=y
+WARNINGS="-Wall"
+KERNEL_SOURCE="/home/work-tmp/jbowler/nslu2/ucslugc/cross/armeb-linux-uclibc/include"
+C_SYMBOL_PREFIX=""
+HAVE_DOT_CONFIG=y
+
+#
+# General Library Settings
+#
+# HAVE_NO_PIC is not set
+DOPIC=y
+# HAVE_NO_SHARED is not set
+HAVE_SHARED=y
+# ARCH_HAS_NO_LDSO is not set
+BUILD_UCLIBC_LDSO=y
+# FORCE_SHAREABLE_TEXT_SEGMENTS is not set
+LDSO_LDD_SUPPORT=y
+LDSO_CACHE_SUPPORT=y
+# LDSO_PRELOAD_FILE_SUPPORT is not set
+LDSO_BASE_FILENAME="ld.so"
+UCLIBC_CTOR_DTOR=y
+# HAS_NO_THREADS is not set
+UCLIBC_HAS_THREADS=y
+PTHREADS_DEBUG_SUPPORT=y
+UCLIBC_HAS_LFS=y
+# UCLIBC_STATIC_LDCONFIG is not set
+# MALLOC is not set
+# MALLOC_SIMPLE is not set
+MALLOC_STANDARD=y
+MALLOC_GLIBC_COMPAT=y
+UCLIBC_DYNAMIC_ATEXIT=y
+HAS_SHADOW=y
+UNIX98PTY_ONLY=y
+ASSUME_DEVPTS=y
+UCLIBC_HAS_TM_EXTENSIONS=y
+UCLIBC_HAS_TZ_CACHING=y
+UCLIBC_HAS_TZ_FILE=y
+UCLIBC_HAS_TZ_FILE_READ_MANY=y
+UCLIBC_TZ_FILE_PATH="/etc/TZ"
+
+#
+# Networking Support
+#
+UCLIBC_HAS_IPV6=y
+UCLIBC_HAS_RPC=y
+UCLIBC_HAS_FULL_RPC=y
+
+#
+# String and Stdio Support
+#
+# UCLIBC_HAS_STRING_GENERIC_OPT is not set
+# UCLIBC_HAS_STRING_ARCH_OPT is not set
+UCLIBC_HAS_CTYPE_TABLES=y
+UCLIBC_HAS_CTYPE_SIGNED=y
+# UCLIBC_HAS_CTYPE_UNSAFE is not set
+UCLIBC_HAS_CTYPE_CHECKED=y
+# UCLIBC_HAS_CTYPE_ENFORCED is not set
+UCLIBC_HAS_WCHAR=y
+# UCLIBC_HAS_LOCALE is not set
+UCLIBC_HAS_HEXADECIMAL_FLOATS=y
+UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y
+UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
+UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y
+# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set
+UCLIBC_HAS_STDIO_BUFSIZ_256=y
+# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_4096 is not set
+# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set
+UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set
+# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
+UCLIBC_HAS_STDIO_GETC_MACRO=y
+UCLIBC_HAS_STDIO_PUTC_MACRO=y
+UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y
+# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set
+UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y
+UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
+UCLIBC_HAS_PRINTF_M_SPEC=y
+UCLIBC_HAS_ERRNO_MESSAGES=y
+# UCLIBC_HAS_SYS_ERRLIST is not set
+UCLIBC_HAS_SIGNUM_MESSAGES=y
+# UCLIBC_HAS_SYS_SIGLIST is not set
+UCLIBC_HAS_GNU_GETOPT=y
+
+#
+# Big and Tall
+#
+UCLIBC_HAS_REGEX=y
+UCLIBC_HAS_WORDEXP=y
+UCLIBC_HAS_FTW=y
+UCLIBC_HAS_GLOB=y
+
+#
+# Library Installation Options
+#
+SHARED_LIB_LOADER_PREFIX="$(DEVEL_PREFIX)/lib"
+RUNTIME_PREFIX="/"
+DEVEL_PREFIX="//usr"
+
+#
+# uClibc security related options
+#
+# UCLIBC_SECURITY is not set
+
+#
+# uClibc development/debugging options
+#
+# DODEBUG is not set
+# DOASSERTS is not set
+# SUPPORT_LD_DEBUG is not set
+# SUPPORT_LD_DEBUG_EARLY is not set
+# UCLIBC_MJN3_ONLY is not set