[uClibc-cvs] svn commit: trunk/uClibc/ldso/ldso/mips

jocke at uclibc.org jocke at uclibc.org
Tue Mar 15 07:40:41 UTC 2005


Author: jocke
Date: 2005-03-15 00:40:40 -0700 (Tue, 15 Mar 2005)
New Revision: 10006

Log:
Fix MIPS initial GOT relocation.


Modified:
   trunk/uClibc/ldso/ldso/mips/dl-startup.h


Changeset:
Modified: trunk/uClibc/ldso/ldso/mips/dl-startup.h
===================================================================
--- trunk/uClibc/ldso/ldso/mips/dl-startup.h	2005-03-14 23:21:05 UTC (rev 10005)
+++ trunk/uClibc/ldso/ldso/mips/dl-startup.h	2005-03-15 07:40:40 UTC (rev 10006)
@@ -51,33 +51,34 @@
 #define PERFORM_BOOTSTRAP_GOT(got, tpnt)					\
 do {										\
 	Elf32_Sym *sym;								\
-	Elf32_Addr i;							\
-	Elf32_Addr *mipsgot = (void *) got;					\
+	Elf32_Addr i;								\
+	register ElfW(Addr) gp __asm__ ("$28");					\
+	Elf32_Addr *mipsgot = elf_mips_got_from_gpreg (gp);			\
 										\
 	/* Add load address displacement to all local GOT entries */		\
 	i = 2;									\
 	while (i < tpnt->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX])			\
-		mipsgot[i++] += load_addr;					\
+		mipsgot[i++] += tpnt->loadaddr;					\
 										\
 	/* Handle global GOT entries */						\
 	mipsgot += tpnt->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX];			\
 	sym = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] +			\
-		 load_addr) + tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];		\
+		 tpnt->loadaddr) + tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];	\
 	i = tpnt->dynamic_info[DT_MIPS_SYMTABNO_IDX] - tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];\
 										\
 	while (i--) {								\
 		if (sym->st_shndx == SHN_UNDEF ||				\
 			sym->st_shndx == SHN_COMMON)				\
-			*mipsgot = load_addr + sym->st_value;			\
+			*mipsgot = tpnt->loadaddr + sym->st_value;		\
 		else if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC &&		\
 			*mipsgot != sym->st_value)				\
-			*mipsgot += load_addr;					\
+			*mipsgot += tpnt->loadaddr;				\
 		else if (ELF32_ST_TYPE(sym->st_info) == STT_SECTION) {		\
 			if (sym->st_other == 0)					\
-				*mipsgot += load_addr;				\
+				*mipsgot += tpnt->loadaddr;			\
 		}								\
 		else								\
-			*mipsgot = load_addr + sym->st_value;			\
+			*mipsgot = tpnt->loadaddr + sym->st_value;		\
 										\
 		mipsgot++;							\
 		sym++;								\




More information about the uClibc-cvs mailing list