[uClibc-cvs] svn commit: trunk/uClibc/ldso: include ldso ldso/arm ldso/cris ldso/i38 etc...

jocke at uclibc.org jocke at uclibc.org
Tue Mar 29 13:47:24 UTC 2005


Author: jocke
Date: 2005-03-29 06:47:21 -0700 (Tue, 29 Mar 2005)
New Revision: 10060

Log:
Moved the addition of load address from the fast path
where possible. This will also make ldso smaller.
However the patch touches all archs and I have only tested PPC and x86.


Modified:
   trunk/uClibc/ldso/include/dl-elf.h
   trunk/uClibc/ldso/include/dl-hash.h
   trunk/uClibc/ldso/ldso/arm/dl-sysdep.h
   trunk/uClibc/ldso/ldso/arm/elfinterp.c
   trunk/uClibc/ldso/ldso/cris/dl-sysdep.h
   trunk/uClibc/ldso/ldso/cris/elfinterp.c
   trunk/uClibc/ldso/ldso/dl-elf.c
   trunk/uClibc/ldso/ldso/dl-hash.c
   trunk/uClibc/ldso/ldso/dl-startup.c
   trunk/uClibc/ldso/ldso/i386/dl-sysdep.h
   trunk/uClibc/ldso/ldso/i386/elfinterp.c
   trunk/uClibc/ldso/ldso/ldso.c
   trunk/uClibc/ldso/ldso/m68k/dl-sysdep.h
   trunk/uClibc/ldso/ldso/m68k/elfinterp.c
   trunk/uClibc/ldso/ldso/mips/dl-startup.h
   trunk/uClibc/ldso/ldso/mips/elfinterp.c
   trunk/uClibc/ldso/ldso/powerpc/dl-sysdep.h
   trunk/uClibc/ldso/ldso/powerpc/elfinterp.c
   trunk/uClibc/ldso/ldso/sh/dl-startup.h
   trunk/uClibc/ldso/ldso/sh/dl-sysdep.h
   trunk/uClibc/ldso/ldso/sh/elfinterp.c
   trunk/uClibc/ldso/ldso/sh64/dl-sysdep.h
   trunk/uClibc/ldso/ldso/sh64/elfinterp.c
   trunk/uClibc/ldso/ldso/sparc/dl-sysdep.h
   trunk/uClibc/ldso/ldso/sparc/elfinterp.c
   trunk/uClibc/ldso/libdl/libdl.c


Changeset:
Modified: trunk/uClibc/ldso/include/dl-elf.h
===================================================================
--- trunk/uClibc/ldso/include/dl-elf.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/include/dl-elf.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -65,10 +65,10 @@
 
 #define DYNAMIC_SIZE (DT_NUM+OS_NUM+ARCH_NUM)
 
-extern void _dl_parse_dynamic_info(Elf32_Dyn *dpnt, unsigned long dynamic_info[], void *debug_addr);
+extern void _dl_parse_dynamic_info(Elf32_Dyn *dpnt, unsigned long dynamic_info[], void *debug_addr, Elf32_Addr load_off);
 
 static inline __attribute__((always_inline))
-void __dl_parse_dynamic_info(Elf32_Dyn *dpnt, unsigned long dynamic_info[], void *debug_addr)
+void __dl_parse_dynamic_info(Elf32_Dyn *dpnt, unsigned long dynamic_info[], void *debug_addr, Elf32_Addr load_off)
 {
 	for (; dpnt->d_tag; dpnt++) {
 		if (dpnt->d_tag < DT_NUM) {
@@ -97,8 +97,22 @@
 		}
 #endif
 	}
-}
+# define ADJUST_DYN_INFO(tag, load_off) \
+	do { \
+		if (dynamic_info[tag]) \
+			dynamic_info[tag] += load_off; \
+	} while(0)
 
+      ADJUST_DYN_INFO (DT_HASH, load_off);
+      ADJUST_DYN_INFO (DT_PLTGOT, load_off);
+      ADJUST_DYN_INFO (DT_STRTAB, load_off);
+      ADJUST_DYN_INFO (DT_SYMTAB, load_off);
+      ADJUST_DYN_INFO (DT_RELOC_TABLE_ADDR, load_off);
+      ADJUST_DYN_INFO (DT_JMPREL, load_off);
+# undef ADJUST_DYN_INFO
+
+					    }
+
 /* Reloc type classes as returned by elf_machine_type_class().
    ELF_RTYPE_CLASS_PLT means this reloc should not be satisfied by
    some PLT symbol, ELF_RTYPE_CLASS_COPY means this reloc should not be

Modified: trunk/uClibc/ldso/include/dl-hash.h
===================================================================
--- trunk/uClibc/ldso/include/dl-hash.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/include/dl-hash.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -77,7 +77,6 @@
 
 extern char * _dl_library_path;
 extern char * _dl_not_lazy;
-extern unsigned long _dl_elf_hash(const unsigned char *name);
 
 static inline int _dl_symbol(char * name)
 {

Modified: trunk/uClibc/ldso/ldso/arm/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/arm/dl-sysdep.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/arm/dl-sysdep.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -93,7 +93,7 @@
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 {
-	 Elf32_Rel * rpnt = (void *) (rel_addr + load_off);
+	 Elf32_Rel * rpnt = (void *) rel_addr;
 	--rpnt;
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

Modified: trunk/uClibc/ldso/ldso/arm/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/arm/elfinterp.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/arm/elfinterp.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -126,14 +126,14 @@
 	char **got_addr;
 	unsigned long instr_addr;
 
-	rel_addr = (ELF_RELOC *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
+	rel_addr = (ELF_RELOC *) tpnt->dynamic_info[DT_JMPREL];
 
 	this_reloc = rel_addr + (reloc_entry >> 3);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(this_reloc->r_info);
 
-	symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *) tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *) tpnt->dynamic_info[DT_STRTAB];
 	symname = strtab + symtab[symtab_index].st_name;
 
 
@@ -190,11 +190,11 @@
 	int symtab_index;
 
 	/* Now parse the relocation information */
-	rpnt = (ELF_RELOC *) (rel_addr + tpnt->loadaddr);
+	rpnt = (ELF_RELOC *) rel_addr;
 	rel_size = rel_size / sizeof(ELF_RELOC);
 
-	symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *) tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *) tpnt->dynamic_info[DT_STRTAB];
 
 	  for (i = 0; i < rel_size; i++, rpnt++) {
 	        int res;

Modified: trunk/uClibc/ldso/ldso/cris/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/cris/dl-sysdep.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/cris/dl-sysdep.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -114,7 +114,7 @@
 elf_machine_relative(Elf32_Addr load_off, const Elf32_Addr rel_addr,
                      Elf32_Word relative_count)
 {
-	Elf32_Rela *rpnt = (void *)(rel_addr + load_off);
+	Elf32_Rela *rpnt = (void *)rel_addr;
 
 	--rpnt;
 	do {

Modified: trunk/uClibc/ldso/ldso/cris/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/cris/elfinterp.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/cris/elfinterp.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -122,14 +122,14 @@
 	ELF_RELOC *this_reloc;
 	unsigned long instr_addr;
 
-	rel_addr = (char *)(tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
+	rel_addr = (char *)tpnt->dynamic_info[DT_JMPREL];
 
 	this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(this_reloc->r_info);
 
-	symtab = (Elf32_Sym *)(intptr_t)(tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *)(tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)(intptr_t)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 	symname = strtab + symtab[symtab_index].st_name;
 
 	if (unlikely(reloc_type != R_CRIS_JUMP_SLOT)) {
@@ -181,11 +181,11 @@
 	ELF_RELOC *rpnt;
 
 	/* Parse the relocation information. */
-	rpnt = (ELF_RELOC *)(intptr_t)(rel_addr + tpnt->loadaddr);
+	rpnt = (ELF_RELOC *)(intptr_t)rel_addr;
 	rel_size /= sizeof(ELF_RELOC);
 
-	symtab = (Elf32_Sym *)(intptr_t)(tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *)(tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)(intptr_t)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		int res;

Modified: trunk/uClibc/ldso/ldso/dl-elf.c
===================================================================
--- trunk/uClibc/ldso/ldso/dl-elf.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/dl-elf.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -307,7 +307,7 @@
 		if (tpnt->libtype == elf_executable) {
 			pnt = (char *) tpnt->dynamic_info[DT_RPATH];
 			if (pnt) {
-				pnt += (unsigned long) tpnt->loadaddr + tpnt->dynamic_info[DT_STRTAB];
+				pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB];
 #if defined (__SUPPORT_LD_DEBUG__)
 				if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching RPATH='%s'\n", pnt);
 #endif
@@ -651,7 +651,7 @@
 
 	dpnt = (Elf32_Dyn *) dynamic_addr;
 	_dl_memset(dynamic_info, 0, sizeof(dynamic_info));
-	_dl_parse_dynamic_info(dpnt, dynamic_info, NULL);
+	_dl_parse_dynamic_info(dpnt, dynamic_info, NULL, libaddr);
 	/* If the TEXTREL is set, this means that we need to make the pages
 	   writable before we perform relocations.  Do this now. They get set
 	   back again later. */
@@ -702,8 +702,7 @@
 	lpnt = (unsigned long *) dynamic_info[DT_PLTGOT];
 
 	if (lpnt) {
-		lpnt = (unsigned long *) (dynamic_info[DT_PLTGOT] +
-				((int) libaddr));
+		lpnt = (unsigned long *) (dynamic_info[DT_PLTGOT]);
 		INIT_GOT(lpnt, tpnt);
 	};
 
@@ -881,9 +880,9 @@
 	return retval;
 }
 
-void _dl_parse_dynamic_info(Elf32_Dyn *dpnt, unsigned long dynamic_info[], void *debug_addr)
+void _dl_parse_dynamic_info(Elf32_Dyn *dpnt, unsigned long dynamic_info[], void *debug_addr, Elf32_Addr load_off)
 {
-	__dl_parse_dynamic_info(dpnt, dynamic_info, debug_addr);
+	__dl_parse_dynamic_info(dpnt, dynamic_info, debug_addr, load_off);
 }
 #ifdef __USE_GNU
 #if ! defined LIBDL || (! defined PIC && ! defined __PIC__)

Modified: trunk/uClibc/ldso/ldso/dl-hash.c
===================================================================
--- trunk/uClibc/ldso/ldso/dl-hash.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/dl-hash.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -57,7 +57,7 @@
 /* This is the hash function that is used by the ELF linker to generate the
  * hash table that each executable and library is required to have.  We need
  * it to decode the hash table.  */
-unsigned long _dl_elf_hash(const unsigned char *name)
+static inline unsigned long _dl_elf_hash(const unsigned char *name)
 {
 	unsigned long hash = 0;
 	unsigned long tmp;
@@ -79,7 +79,7 @@
 
 	for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {
 		if (_dl_strncmp(tpnt->libname, libname, len) == 0 &&
-				(tpnt->libname[len] == '\0' || tpnt->libname[len] == '.'))
+		    (tpnt->libname[len] == '\0' || tpnt->libname[len] == '.'))
 			return tpnt;
 	}
 
@@ -119,7 +119,7 @@
 	tpnt->libtype = loaded_file;
 
 	if (dynamic_info[DT_HASH] != 0) {
-		hash_addr = (unsigned long *) (intptr_t)(dynamic_info[DT_HASH] + loadaddr);
+		hash_addr = (unsigned long *) (intptr_t)(dynamic_info[DT_HASH]);
 		tpnt->nbucket = *hash_addr++;
 		tpnt->nchain = *hash_addr++;
 		tpnt->elf_buckets = hash_addr;
@@ -172,8 +172,8 @@
 
 		/* Avoid calling .urem here. */
 		do_rem(hn, elf_hash_number, tpnt->nbucket);
-		symtab = (Elf32_Sym *) (intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-		strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+		symtab = (Elf32_Sym *) (intptr_t) (tpnt->dynamic_info[DT_SYMTAB]);
+		strtab = (char *) (tpnt->dynamic_info[DT_STRTAB]);
 
 		for (si = tpnt->elf_buckets[hn]; si != STN_UNDEF; si = tpnt->chains[si]) {
 			sym = &symtab[si];

Modified: trunk/uClibc/ldso/ldso/dl-startup.c
===================================================================
--- trunk/uClibc/ldso/ldso/dl-startup.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/dl-startup.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -205,9 +205,9 @@
 	tpnt->dynamic_addr = dpnt;
 #if defined(__mips__) || defined(__cris__)
 	/* Some architectures cannot call functions here, must inline */
-	__dl_parse_dynamic_info(dpnt, tpnt->dynamic_info, NULL);
+	__dl_parse_dynamic_info(dpnt, tpnt->dynamic_info, NULL, load_addr);
 #else
-	_dl_parse_dynamic_info(dpnt, tpnt->dynamic_info, NULL);
+	_dl_parse_dynamic_info(dpnt, tpnt->dynamic_info, NULL, load_addr);
 #endif
 
 #ifdef __SUPPORT_LD_DEBUG_EARLY__
@@ -299,8 +299,8 @@
 				char *strtab;
 				Elf32_Sym *symtab;
 
-				symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + load_addr);
-				strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + load_addr);
+				symtab = (Elf32_Sym *) tpnt->dynamic_info[DT_SYMTAB];
+				strtab = (char *) tpnt->dynamic_info[DT_STRTAB];
 				sym = &symtab[symtab_index];
 				symbol_addr = load_addr + sym->st_value;
 

Modified: trunk/uClibc/ldso/ldso/i386/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/i386/dl-sysdep.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/i386/dl-sysdep.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -71,7 +71,7 @@
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 {
-	Elf32_Rel * rpnt = (void *) (rel_addr + load_off);
+	Elf32_Rel * rpnt = (void *) rel_addr;
 	--rpnt;
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

Modified: trunk/uClibc/ldso/ldso/i386/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/i386/elfinterp.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/i386/elfinterp.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -125,14 +125,14 @@
 	unsigned long instr_addr;
 	char *symname;
 
-	rel_addr = (char *)(tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
+	rel_addr = (char *)tpnt->dynamic_info[DT_JMPREL];
 
 	this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(this_reloc->r_info);
 
-	symtab = (Elf32_Sym *)(intptr_t)(tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *)(tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)(intptr_t)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 	symname = strtab + symtab[symtab_index].st_name;
 
 	if (unlikely(reloc_type != R_386_JMP_SLOT)) {
@@ -186,11 +186,11 @@
 	int symtab_index;
 
 	/* Parse the relocation information. */
-	rpnt = (ELF_RELOC *)(intptr_t)(rel_addr + tpnt->loadaddr);
+	rpnt = (ELF_RELOC *)(intptr_t)rel_addr;
 	rel_size /= sizeof(ELF_RELOC);
 
-	symtab = (Elf32_Sym *)(intptr_t)(tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *)(tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)(intptr_t)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		int res;

Modified: trunk/uClibc/ldso/ldso/ldso.c
===================================================================
--- trunk/uClibc/ldso/ldso/ldso.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/ldso.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -235,7 +235,7 @@
 		}
 		if (ppnt->p_type == PT_DYNAMIC) {
 			dpnt = (Elf32_Dyn *) (ppnt->p_vaddr + app_tpnt->loadaddr);
-			_dl_parse_dynamic_info(dpnt, app_tpnt->dynamic_info, debug_addr);
+			_dl_parse_dynamic_info(dpnt, app_tpnt->dynamic_info, debug_addr, app_tpnt->loadaddr);
 #ifndef __FORCE_SHAREABLE_TEXT_SEGMENTS__
 			/* Ugly, ugly.  We need to call mprotect to change the
 			 * protection of the text pages so that we can do the
@@ -275,7 +275,7 @@
 			app_tpnt->rtld_flags = unlazy | RTLD_GLOBAL;
 			app_tpnt->usage_count++;
 			app_tpnt->symbol_scope = _dl_symbol_tables;
-			lpnt = (unsigned long *) (app_tpnt->dynamic_info[DT_PLTGOT] + app_tpnt->loadaddr);
+			lpnt = (unsigned long *) (app_tpnt->dynamic_info[DT_PLTGOT]);
 #ifdef ALLOW_ZERO_PLTGOT
 			if (lpnt)
 #endif
@@ -572,7 +572,7 @@
 				char *name;
 				struct init_fini_list *tmp;
 
-				lpntstr = (char*) (tcurr->loadaddr + tcurr->dynamic_info[DT_STRTAB] + dpnt->d_un.d_val);
+				lpntstr = (char*) (tcurr->dynamic_info[DT_STRTAB] + dpnt->d_un.d_val);
 				name = _dl_get_last_path_component(lpntstr);
 
 				if ((tpnt1 = _dl_check_if_named_library_is_loaded(name, trace_loaded_objects)))	{
@@ -717,7 +717,7 @@
 #ifdef RERELOCATE_LDSO
 		/* Only rerelocate functions for now. */
 		tpnt->init_flag = RELOCS_DONE;
-		lpnt = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT] + load_addr);
+		lpnt = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT]);
 # ifdef ALLOW_ZERO_PLTGOT
 		if (tpnt->dynamic_info[DT_PLTGOT])
 # endif

Modified: trunk/uClibc/ldso/ldso/m68k/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/m68k/dl-sysdep.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/m68k/dl-sysdep.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -68,7 +68,7 @@
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 {
-	 Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	 Elf32_Rela * rpnt = (void *)rel_addr;
 	--rpnt;
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

Modified: trunk/uClibc/ldso/ldso/m68k/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/m68k/elfinterp.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/m68k/elfinterp.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -69,13 +69,13 @@
 	char **got_addr;
 	unsigned int instr_addr;
 
-	rel_addr = (ELF_RELOC *)(tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
+	rel_addr = (ELF_RELOC *)tpnt->dynamic_info[DT_JMPREL];
 	this_reloc = (Elf32_Rela *) (rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE (this_reloc->r_info);
 	symtab_index = ELF32_R_SYM (this_reloc->r_info);
 
-	symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 
 	if (unlikely(reloc_type != R_68K_JMP_SLOT)) {
 		_dl_dprintf (2, "%s: incorrect relocation type in jump relocations\n",
@@ -136,12 +136,11 @@
 	struct elf_resolve *tpnt = arg_rpnt->dyn;
 
 	/* Now parse the relocation information.  */
-	rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr);
+	rpnt = (Elf32_Rela *)rel_addr;
 	rel_size = rel_size / sizeof (Elf32_Rela);
 
-	symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB]
-	         + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset);
@@ -184,12 +183,11 @@
 	struct elf_resolve *tpnt = arg_rpnt->dyn;
 	/* Now parse the relocation information */
 
-	rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr);
+	rpnt = (Elf32_Rela *)rel_addr;
 	rel_size = rel_size / sizeof (Elf32_Rela);
 
-	symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB]
-	         + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset);

Modified: trunk/uClibc/ldso/ldso/mips/dl-startup.h
===================================================================
--- trunk/uClibc/ldso/ldso/mips/dl-startup.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/mips/dl-startup.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -64,8 +64,8 @@
 										\
 	/* Handle global GOT entries */						\
 	mipsgot += tpnt->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX];			\
-	sym = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] +			\
-		 tpnt->loadaddr) + tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];	\
+	sym = (Elf32_Sym *) tpnt->dynamic_info[DT_SYMTAB] +			\
+		 	tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];			\
 	i = tpnt->dynamic_info[DT_MIPS_SYMTABNO_IDX] - tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];\
 										\
 	while (i--) {								\

Modified: trunk/uClibc/ldso/ldso/mips/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/mips/elfinterp.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/mips/elfinterp.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -124,8 +124,8 @@
 	gotsym = tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];
 	local_gotno = tpnt->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX];
 
-	sym = ((Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr)) + sym_index;
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	sym = ((Elf32_Sym *) tpnt->dynamic_info[DT_SYMTAB]) + sym_index;
+	strtab = (char *) tpnt->dynamic_info[DT_STRTAB];
 	symname = strtab + sym->st_name;
 
 	new_addr = (unsigned long) _dl_find_hash(symname,
@@ -182,11 +182,11 @@
 
 	/* Now parse the relocation information */
 	rel_size = rel_size / sizeof(Elf32_Rel);
-	rpnt = (Elf32_Rel *) (rel_addr + tpnt->loadaddr);
+	rpnt = (Elf32_Rel *) rel_addr;
 
-	symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
-	got = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *) tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *) tpnt->dynamic_info[DT_STRTAB];
+	got = (unsigned long *) tpnt->dynamic_info[DT_PLTGOT];
 
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		reloc_addr = (unsigned long *) (tpnt->loadaddr +
@@ -261,12 +261,10 @@
 			continue;
 
 		/* Setup the loop variables */
-		got_entry = (unsigned long *) (tpnt->loadaddr +
-			tpnt->dynamic_info[DT_PLTGOT]) + tpnt->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX];
-		sym = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] +
-			(unsigned long) tpnt->loadaddr) + tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];
-		strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] +
-			(unsigned long) tpnt->loadaddr);
+		got_entry = (unsigned long *) (tpnt->dynamic_info[DT_PLTGOT])
+			+ tpnt->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX];
+		sym = (Elf32_Sym *) tpnt->dynamic_info[DT_SYMTAB] + tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];
+		strtab = (char *) tpnt->dynamic_info[DT_STRTAB];
 		i = tpnt->dynamic_info[DT_MIPS_SYMTABNO_IDX] - tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];
 
 #if defined (__SUPPORT_LD_DEBUG__)

Modified: trunk/uClibc/ldso/ldso/powerpc/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/powerpc/dl-sysdep.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/powerpc/dl-sysdep.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -158,7 +158,7 @@
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 {
-	 Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	 Elf32_Rela * rpnt = (void *)rel_addr;
 	--rpnt;
 	do {     /* PowerPC handles pre increment/decrement better */ 
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

Modified: trunk/uClibc/ldso/ldso/powerpc/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/powerpc/elfinterp.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/powerpc/elfinterp.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -181,14 +181,14 @@
 	Elf32_Addr  finaladdr;
 	Elf32_Sword delta;
 
-	rel_addr = (ELF_RELOC *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
+	rel_addr = (ELF_RELOC *)tpnt->dynamic_info[DT_JMPREL];
 
 	this_reloc = (void *)rel_addr + reloc_entry;
 	symtab_index = ELF32_R_SYM(this_reloc->r_info);
 
-	symtab = (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
-	symname      = strtab + symtab[symtab_index].st_name;
+	symtab = (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
+	symname = strtab + symtab[symtab_index].st_name;
 
 #if defined (__SUPPORT_LD_DEBUG__)
 	debug_sym(symtab,strtab,symtab_index);
@@ -229,7 +229,7 @@
 		/* Warning: we don't handle double-sized PLT entries */
 		Elf32_Word *plt, *data_words, index, offset;
 
-		plt = (Elf32_Word *)(tpnt->dynamic_info[DT_PLTGOT] + tpnt->loadaddr);
+		plt = (Elf32_Word *)tpnt->dynamic_info[DT_PLTGOT];
 		offset = reloc_addr - plt;
 		index = (offset - PLT_INITIAL_ENTRY_WORDS)/2;
 		data_words = (Elf32_Word *)tpnt->data_words;
@@ -265,7 +265,7 @@
 #endif
 	reloc_addr   = (Elf32_Addr *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset);
 	reloc_type   = ELF32_R_TYPE(rpnt->r_info);
-	symbol_addr = tpnt->loadaddr; /* For R_PPC_RELATIVE */ 
+	symbol_addr  = tpnt->loadaddr; /* For R_PPC_RELATIVE */ 
 	symtab_index = ELF32_R_SYM(rpnt->r_info);
 	symname      = strtab + symtab[symtab_index].st_name;
 	if (symtab_index) {
@@ -275,10 +275,8 @@
 		 * have been intentional.  We should not be linking local symbols
 		 * here, so all bases should be covered.
 		 */
-		if (unlikely(!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK)) {
-			_dl_dprintf(2, "%s: can't resolve symbol '%s'\n", _dl_progname, symname);
-			_dl_exit(1);
-		};
+		if (unlikely(!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) != STB_WEAK))
+			return -1;
 	}
 #if defined (__SUPPORT_LD_DEBUG__)
 	old_val = *reloc_addr;
@@ -302,7 +300,7 @@
 			/* Warning: we don't handle double-sized PLT entries */
 			Elf32_Word *plt, *data_words, index, offset;
 
-			plt = (Elf32_Word *)(tpnt->dynamic_info[DT_PLTGOT] + tpnt->loadaddr);
+			plt = (Elf32_Word *)tpnt->dynamic_info[DT_PLTGOT];
 			offset = reloc_addr - plt;
 			index = (offset - PLT_INITIAL_ENTRY_WORDS)/2;
 			data_words = (Elf32_Word *)tpnt->data_words;
@@ -349,7 +347,7 @@
 		}
 #else
 		_dl_dprintf(2,"R_PPC_REL24: Compile shared libraries with -fPIC!\n");
-		_dl_exit(1);
+		return -1;
 #endif
 	case R_PPC_NONE:
 		goto out_nocode; /* No code code modified */
@@ -385,7 +383,7 @@
 	num_plt_entries = rel_size / sizeof(ELF_RELOC);
 
 	rel_offset_words = PLT_DATA_START_WORDS(num_plt_entries);
-	plt = (Elf32_Word *)(tpnt->dynamic_info[DT_PLTGOT] + tpnt->loadaddr);
+	plt = (Elf32_Word *)tpnt->dynamic_info[DT_PLTGOT];
 
 	/* Set up the lazy PLT entries.  */
 	offset = PLT_INITIAL_ENTRY_WORDS;
@@ -428,11 +426,11 @@
 	int symtab_index;
 
 	/* Now parse the relocation information */
-	rpnt = (ELF_RELOC *)(intptr_t) (rel_addr + tpnt->loadaddr);
+	rpnt = (ELF_RELOC *)(intptr_t)rel_addr;
 	rel_size = rel_size / sizeof(ELF_RELOC);
 
-	symtab = (Elf32_Sym *)(intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)(intptr_t)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 	
 	  for (i = 0; i < rel_size; i++, rpnt++) {
 	        int res;

Modified: trunk/uClibc/ldso/ldso/sh/dl-startup.h
===================================================================
--- trunk/uClibc/ldso/ldso/sh/dl-startup.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/sh/dl-startup.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -68,7 +68,3 @@
  * call the _dl_elf_main function.
  */
 #define START()   return _dl_elf_main;
-
-
-
-

Modified: trunk/uClibc/ldso/ldso/sh/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/sh/dl-sysdep.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/sh/dl-sysdep.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -156,7 +156,7 @@
 		      Elf32_Word relative_count)
 {
 	Elf32_Addr value;
-	Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	Elf32_Rela * rpnt = (void *)rel_addr;
 
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + rpnt->r_offset);

Modified: trunk/uClibc/ldso/ldso/sh/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/sh/elfinterp.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/sh/elfinterp.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -126,14 +126,14 @@
 	unsigned long instr_addr;
 	char *symname;
 
-	rel_addr = (char *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
+	rel_addr = (char *)tpnt->dynamic_info[DT_JMPREL];
 
 	this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(this_reloc->r_info);
 
-	symtab = (Elf32_Sym *)(intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)(intptr_t) tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *) tpnt->dynamic_info[DT_STRTAB];
 	symname = strtab + symtab[symtab_index].st_name;
 
 	if (unlikely(reloc_type != R_SH_JMP_SLOT)) {
@@ -189,11 +189,11 @@
 	int symtab_index;
 	/* Now parse the relocation information */
 
-	rpnt = (ELF_RELOC *)(intptr_t) (rel_addr + tpnt->loadaddr);
+	rpnt = (ELF_RELOC *)(intptr_t) rel_addr;
 	rel_size = rel_size / sizeof(ELF_RELOC);
 
-	symtab = (Elf32_Sym *)(intptr_t) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)(intptr_t)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 
 	  for (i = 0; i < rel_size; i++, rpnt++) {
 	        int res;

Modified: trunk/uClibc/ldso/ldso/sh64/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/sh64/dl-sysdep.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/sh64/dl-sysdep.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -100,7 +100,7 @@
 		      Elf32_Word relative_count)
 {
 	Elf32_Addr value;
-	Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	Elf32_Rela * rpnt = (void *)rel_addr;
 
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + rpnt->r_offset);

Modified: trunk/uClibc/ldso/ldso/sh64/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/sh64/elfinterp.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/sh64/elfinterp.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -166,15 +166,14 @@
 	unsigned long instr_addr;
 	char *symname;
 
-	rel_addr = (char *)(tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
+	rel_addr = (char *)tpnt->dynamic_info[DT_JMPREL];
 
 	this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(this_reloc->r_info);
 
-	symtab = (Elf32_Sym *)(intptr_t)
-		(tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *)(tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)(intptr_t)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 	symname = strtab + symtab[symtab_index].st_name;
 
 	if (unlikely(reloc_type != R_SH_JMP_SLOT)) {
@@ -233,12 +232,11 @@
 	int symtab_index;
 
 	/* Now parse the relocation information */
-	rpnt = (ELF_RELOC *)(intptr_t)(rel_addr + tpnt->loadaddr);
+	rpnt = (ELF_RELOC *)(intptr_t)rel_addr;
 	rel_size = rel_size / sizeof(ELF_RELOC);
 
-	symtab = (Elf32_Sym *)(intptr_t)
-		(tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-	strtab = (char *)(tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+	symtab = (Elf32_Sym *)(intptr_t)tpnt->dynamic_info[DT_SYMTAB];
+	strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		int res;

Modified: trunk/uClibc/ldso/ldso/sparc/dl-sysdep.h
===================================================================
--- trunk/uClibc/ldso/ldso/sparc/dl-sysdep.h	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/sparc/dl-sysdep.h	2005-03-29 13:47:21 UTC (rev 10060)
@@ -160,7 +160,7 @@
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 {
-	 Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	 Elf32_Rela * rpnt = (void *)rel_addr;
 	--rpnt;
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

Modified: trunk/uClibc/ldso/ldso/sparc/elfinterp.c
===================================================================
--- trunk/uClibc/ldso/ldso/sparc/elfinterp.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/ldso/sparc/elfinterp.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -66,8 +66,7 @@
   unsigned int instr_addr;
   tpnt = (struct elf_resolve *) plt[2];
 
-  rel_addr = (Elf32_Rela *) (tpnt->dynamic_info[DT_JMPREL] +
-				   tpnt->loadaddr);
+  rel_addr = (Elf32_Rela *)tpnt->dynamic_info[DT_JMPREL];
 
   /*
    * Generate the correct relocation index into the .rela.plt section.
@@ -79,8 +78,8 @@
   reloc_type = ELF32_R_TYPE(this_reloc->r_info);
   symtab_index = ELF32_R_SYM(this_reloc->r_info);
 
-  symtab =  (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-  strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+  symtab =  (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
+  strtab = (char *)tpnt->dynamic_info[DT_STRTAB];
 
 #ifdef __SUPPORT_LD_DEBUG__
   if (_dl_debug_symbols) {
@@ -159,10 +158,10 @@
   struct elf_resolve * tpnt = arg_rpnt->dyn;
 
   /* Now parse the relocation information */
-  rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr);
+  rpnt = (Elf32_Rela *)rel_addr;
 
-  symtab =  (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-  strtab = ( char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+  symtab =  (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
+  strtab = ( char *)tpnt->dynamic_info[DT_STRTAB];
 
   for(i=0; i< rel_size; i += sizeof(Elf32_Rela), rpnt++){
     reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset);
@@ -201,10 +200,10 @@
   struct elf_resolve * tpnt = arg_rpnt->dyn;
   /* Now parse the relocation information */
 
-  rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr);
+  rpnt = (Elf32_Rela *)rel_addr;
 
-  symtab =  (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
-  strtab = ( char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
+  symtab =  (Elf32_Sym *)tpnt->dynamic_info[DT_SYMTAB];
+  strtab = ( char *)tpnt->dynamic_info[DT_STRTAB];
 
   for(i=0; i< rel_size; i+= sizeof(Elf32_Rela), rpnt++){
     reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset);

Modified: trunk/uClibc/ldso/libdl/libdl.c
===================================================================
--- trunk/uClibc/ldso/libdl/libdl.c	2005-03-26 06:46:02 UTC (rev 10059)
+++ trunk/uClibc/ldso/libdl/libdl.c	2005-03-29 13:47:21 UTC (rev 10060)
@@ -212,7 +212,7 @@
 			if (dpnt->d_tag == DT_NEEDED) {
 				char *name;
 
-				lpntstr = (char*) (tcurr->loadaddr + tcurr->dynamic_info[DT_STRTAB] +
+				lpntstr = (char*) (tcurr->dynamic_info[DT_STRTAB] +
 						dpnt->d_un.d_val);
 				name = _dl_get_last_path_component(lpntstr);
 				tpnt1 = _dl_check_if_named_library_is_loaded(name, 0);
@@ -640,8 +640,8 @@
 		ElfW(Addr) sa;
 
 		sa = 0;
-		symtab = (Elf32_Sym *) (pelf->dynamic_info[DT_SYMTAB] + pelf->loadaddr);
-		strtab = (char *) (pelf->dynamic_info[DT_STRTAB] + pelf->loadaddr);
+		symtab = (Elf32_Sym *) (pelf->dynamic_info[DT_SYMTAB]);
+		strtab = (char *) (pelf->dynamic_info[DT_STRTAB]);
 
 		sf = 0;
 		for (hn = 0; hn < pelf->nbucket; hn++) {




More information about the uClibc-cvs mailing list