Subject: [PATCH] ldso: AVR32 startup hack

AVR32 needs to do both PERFORM_BOOTSTRAP_GOT and a full relocation of
the GOT. I don't quite remember why, but I think it's because some GOT
entries just need the load address added to them, while the rest need
the full relocation code.

This patch should be revisited to figure out whether we're processing
relocations against undefined symbols and whether that's something we
should be doing...

---

 ldso/ldso/dl-startup.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Index: uClibc-0.9.28/ldso/ldso/dl-startup.c
===================================================================
--- uClibc-0.9.28.orig/ldso/ldso/dl-startup.c	2006-02-07 16:49:27.000000000 +0100
+++ uClibc-0.9.28/ldso/ldso/dl-startup.c	2006-02-07 17:12:09.000000000 +0100
@@ -217,7 +217,9 @@ static void * __attribute_used__ _dl_sta
 	/* some arches (like MIPS) we have to tweak the GOT before relocations */
 	PERFORM_BOOTSTRAP_GOT(tpnt);
 
-#else
+#endif
+
+#if !defined(PERFORM_BOOTSTRAP_GOT) || defined(__avr32__)
 
 	/* OK, now do the relocations.  We do not do a lazy binding here, so
 	   that once we are done, we have considerably more flexibility. */
@@ -259,7 +261,7 @@ static void * __attribute_used__ _dl_sta
 				rel_addr += relative_count * sizeof(ELF_RELOC);;
 			}
 
-			rpnt = (ELF_RELOC *) (rel_addr + load_addr);
+			rpnt = (ELF_RELOC *) (rel_addr /* + load_addr */);
 			for (i = 0; i < rel_size; i += sizeof(ELF_RELOC), rpnt++) {
 				reloc_addr = (unsigned long *) (load_addr + (unsigned long) rpnt->r_offset);
 				symtab_index = ELF_R_SYM(rpnt->r_info);
