Browse Source

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.

Joakim Tjernlund 19 năm trước cách đây
mục cha
commit
e6816a15ab

+ 17 - 3
ldso/include/dl-elf.h

@@ -65,10 +65,10 @@ extern void _dl_protect_relro (struct elf_resolve *l);
 
 
 #define DYNAMIC_SIZE (DT_NUM+OS_NUM+ARCH_NUM)
 #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))
 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++) {
 	for (; dpnt->d_tag; dpnt++) {
 		if (dpnt->d_tag < DT_NUM) {
 		if (dpnt->d_tag < DT_NUM) {
@@ -97,7 +97,21 @@ void __dl_parse_dynamic_info(Elf32_Dyn *dpnt, unsigned long dynamic_info[], void
 		}
 		}
 #endif
 #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().
 /* Reloc type classes as returned by elf_machine_type_class().
    ELF_RTYPE_CLASS_PLT means this reloc should not be satisfied by
    ELF_RTYPE_CLASS_PLT means this reloc should not be satisfied by

+ 0 - 1
ldso/include/dl-hash.h

@@ -77,7 +77,6 @@ extern int _dl_linux_dynamic_link(void);
 
 
 extern char * _dl_library_path;
 extern char * _dl_library_path;
 extern char * _dl_not_lazy;
 extern char * _dl_not_lazy;
-extern unsigned long _dl_elf_hash(const unsigned char *name);
 
 
 static inline int _dl_symbol(char * name)
 static inline int _dl_symbol(char * name)
 {
 {

+ 1 - 1
ldso/ldso/arm/dl-sysdep.h

@@ -93,7 +93,7 @@ static inline void
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 		      Elf32_Word relative_count)
 {
 {
-	 Elf32_Rel * rpnt = (void *) (rel_addr + load_off);
+	 Elf32_Rel * rpnt = (void *) rel_addr;
 	--rpnt;
 	--rpnt;
 	do {
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

+ 6 - 6
ldso/ldso/arm/elfinterp.c

@@ -126,14 +126,14 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
 	char **got_addr;
 	char **got_addr;
 	unsigned long instr_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);
 	this_reloc = rel_addr + (reloc_entry >> 3);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(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;
 	symname = strtab + symtab[symtab_index].st_name;
 
 
 
 
@@ -190,11 +190,11 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
 	int symtab_index;
 	int symtab_index;
 
 
 	/* Now parse the relocation information */
 	/* Now parse the relocation information */
-	rpnt = (ELF_RELOC *) (rel_addr + tpnt->loadaddr);
+	rpnt = (ELF_RELOC *) rel_addr;
 	rel_size = rel_size / sizeof(ELF_RELOC);
 	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++) {
 	  for (i = 0; i < rel_size; i++, rpnt++) {
 	        int res;
 	        int res;

+ 1 - 1
ldso/ldso/cris/dl-sysdep.h

@@ -114,7 +114,7 @@ static inline void
 elf_machine_relative(Elf32_Addr load_off, const Elf32_Addr rel_addr,
 elf_machine_relative(Elf32_Addr load_off, const Elf32_Addr rel_addr,
                      Elf32_Word relative_count)
                      Elf32_Word relative_count)
 {
 {
-	Elf32_Rela *rpnt = (void *)(rel_addr + load_off);
+	Elf32_Rela *rpnt = (void *)rel_addr;
 
 
 	--rpnt;
 	--rpnt;
 	do {
 	do {

+ 6 - 6
ldso/ldso/cris/elfinterp.c

@@ -122,14 +122,14 @@ _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
 	ELF_RELOC *this_reloc;
 	ELF_RELOC *this_reloc;
 	unsigned long instr_addr;
 	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);
 	this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(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;
 	symname = strtab + symtab[symtab_index].st_name;
 
 
 	if (unlikely(reloc_type != R_CRIS_JUMP_SLOT)) {
 	if (unlikely(reloc_type != R_CRIS_JUMP_SLOT)) {
@@ -181,11 +181,11 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
 	ELF_RELOC *rpnt;
 	ELF_RELOC *rpnt;
 
 
 	/* Parse the relocation information. */
 	/* 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);
 	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++) {
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		int res;
 		int res;

+ 5 - 6
ldso/ldso/dl-elf.c

@@ -307,7 +307,7 @@ struct elf_resolve *_dl_load_shared_library(int secure, struct dyn_elf **rpnt,
 		if (tpnt->libtype == elf_executable) {
 		if (tpnt->libtype == elf_executable) {
 			pnt = (char *) tpnt->dynamic_info[DT_RPATH];
 			pnt = (char *) tpnt->dynamic_info[DT_RPATH];
 			if (pnt) {
 			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 defined (__SUPPORT_LD_DEBUG__)
 				if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching RPATH='%s'\n", pnt);
 				if(_dl_debug) _dl_dprintf(_dl_debug_file, "\tsearching RPATH='%s'\n", pnt);
 #endif
 #endif
@@ -651,7 +651,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
 
 
 	dpnt = (Elf32_Dyn *) dynamic_addr;
 	dpnt = (Elf32_Dyn *) dynamic_addr;
 	_dl_memset(dynamic_info, 0, sizeof(dynamic_info));
 	_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
 	/* 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
 	   writable before we perform relocations.  Do this now. They get set
 	   back again later. */
 	   back again later. */
@@ -702,8 +702,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
 	lpnt = (unsigned long *) dynamic_info[DT_PLTGOT];
 	lpnt = (unsigned long *) dynamic_info[DT_PLTGOT];
 
 
 	if (lpnt) {
 	if (lpnt) {
-		lpnt = (unsigned long *) (dynamic_info[DT_PLTGOT] +
-				((int) libaddr));
+		lpnt = (unsigned long *) (dynamic_info[DT_PLTGOT]);
 		INIT_GOT(lpnt, tpnt);
 		INIT_GOT(lpnt, tpnt);
 	};
 	};
 
 
@@ -881,9 +880,9 @@ char *_dl_strdup(const char *string)
 	return retval;
 	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
 #ifdef __USE_GNU
 #if ! defined LIBDL || (! defined PIC && ! defined __PIC__)
 #if ! defined LIBDL || (! defined PIC && ! defined __PIC__)

+ 5 - 5
ldso/ldso/dl-hash.c

@@ -57,7 +57,7 @@ struct dyn_elf *_dl_handles = NULL;
 /* This is the hash function that is used by the ELF linker to generate the
 /* 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
  * hash table that each executable and library is required to have.  We need
  * it to decode the hash table.  */
  * 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 hash = 0;
 	unsigned long tmp;
 	unsigned long tmp;
@@ -79,7 +79,7 @@ struct elf_resolve *_dl_check_hashed_files(const char *libname)
 
 
 	for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {
 	for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {
 		if (_dl_strncmp(tpnt->libname, libname, len) == 0 &&
 		if (_dl_strncmp(tpnt->libname, libname, len) == 0 &&
-				(tpnt->libname[len] == '\0' || tpnt->libname[len] == '.'))
+		    (tpnt->libname[len] == '\0' || tpnt->libname[len] == '.'))
 			return tpnt;
 			return tpnt;
 	}
 	}
 
 
@@ -119,7 +119,7 @@ struct elf_resolve *_dl_add_elf_hash_table(const char *libname,
 	tpnt->libtype = loaded_file;
 	tpnt->libtype = loaded_file;
 
 
 	if (dynamic_info[DT_HASH] != 0) {
 	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->nbucket = *hash_addr++;
 		tpnt->nchain = *hash_addr++;
 		tpnt->nchain = *hash_addr++;
 		tpnt->elf_buckets = hash_addr;
 		tpnt->elf_buckets = hash_addr;
@@ -172,8 +172,8 @@ char *_dl_find_hash(const char *name, struct dyn_elf *rpnt, struct elf_resolve *
 
 
 		/* Avoid calling .urem here. */
 		/* Avoid calling .urem here. */
 		do_rem(hn, elf_hash_number, tpnt->nbucket);
 		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]) {
 		for (si = tpnt->elf_buckets[hn]; si != STN_UNDEF; si = tpnt->chains[si]) {
 			sym = &symtab[si];
 			sym = &symtab[si];

+ 4 - 4
ldso/ldso/dl-startup.c

@@ -205,9 +205,9 @@ static void * __attribute_used__ _dl_start(unsigned long args)
 	tpnt->dynamic_addr = dpnt;
 	tpnt->dynamic_addr = dpnt;
 #if defined(__mips__) || defined(__cris__)
 #if defined(__mips__) || defined(__cris__)
 	/* Some architectures cannot call functions here, must inline */
 	/* 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
 #else
-	_dl_parse_dynamic_info(dpnt, tpnt->dynamic_info, NULL);
+	_dl_parse_dynamic_info(dpnt, tpnt->dynamic_info, NULL, load_addr);
 #endif
 #endif
 
 
 #ifdef __SUPPORT_LD_DEBUG_EARLY__
 #ifdef __SUPPORT_LD_DEBUG_EARLY__
@@ -299,8 +299,8 @@ static void * __attribute_used__ _dl_start(unsigned long args)
 				char *strtab;
 				char *strtab;
 				Elf32_Sym *symtab;
 				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];
 				sym = &symtab[symtab_index];
 				symbol_addr = load_addr + sym->st_value;
 				symbol_addr = load_addr + sym->st_value;
 
 

+ 1 - 1
ldso/ldso/i386/dl-sysdep.h

@@ -71,7 +71,7 @@ static inline void
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 		      Elf32_Word relative_count)
 {
 {
-	Elf32_Rel * rpnt = (void *) (rel_addr + load_off);
+	Elf32_Rel * rpnt = (void *) rel_addr;
 	--rpnt;
 	--rpnt;
 	do {
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

+ 6 - 6
ldso/ldso/i386/elfinterp.c

@@ -125,14 +125,14 @@ _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
 	unsigned long instr_addr;
 	unsigned long instr_addr;
 	char *symname;
 	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);
 	this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(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;
 	symname = strtab + symtab[symtab_index].st_name;
 
 
 	if (unlikely(reloc_type != R_386_JMP_SLOT)) {
 	if (unlikely(reloc_type != R_386_JMP_SLOT)) {
@@ -186,11 +186,11 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
 	int symtab_index;
 	int symtab_index;
 
 
 	/* Parse the relocation information. */
 	/* 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);
 	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++) {
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		int res;
 		int res;

+ 4 - 4
ldso/ldso/ldso.c

@@ -235,7 +235,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, unsigned long load_addr,
 		}
 		}
 		if (ppnt->p_type == PT_DYNAMIC) {
 		if (ppnt->p_type == PT_DYNAMIC) {
 			dpnt = (Elf32_Dyn *) (ppnt->p_vaddr + app_tpnt->loadaddr);
 			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__
 #ifndef __FORCE_SHAREABLE_TEXT_SEGMENTS__
 			/* Ugly, ugly.  We need to call mprotect to change the
 			/* Ugly, ugly.  We need to call mprotect to change the
 			 * protection of the text pages so that we can do the
 			 * protection of the text pages so that we can do the
@@ -275,7 +275,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, unsigned long load_addr,
 			app_tpnt->rtld_flags = unlazy | RTLD_GLOBAL;
 			app_tpnt->rtld_flags = unlazy | RTLD_GLOBAL;
 			app_tpnt->usage_count++;
 			app_tpnt->usage_count++;
 			app_tpnt->symbol_scope = _dl_symbol_tables;
 			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
 #ifdef ALLOW_ZERO_PLTGOT
 			if (lpnt)
 			if (lpnt)
 #endif
 #endif
@@ -572,7 +572,7 @@ next_lib2:
 				char *name;
 				char *name;
 				struct init_fini_list *tmp;
 				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);
 				name = _dl_get_last_path_component(lpntstr);
 
 
 				if ((tpnt1 = _dl_check_if_named_library_is_loaded(name, trace_loaded_objects)))	{
 				if ((tpnt1 = _dl_check_if_named_library_is_loaded(name, trace_loaded_objects)))	{
@@ -717,7 +717,7 @@ next_lib2:
 #ifdef RERELOCATE_LDSO
 #ifdef RERELOCATE_LDSO
 		/* Only rerelocate functions for now. */
 		/* Only rerelocate functions for now. */
 		tpnt->init_flag = RELOCS_DONE;
 		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
 # ifdef ALLOW_ZERO_PLTGOT
 		if (tpnt->dynamic_info[DT_PLTGOT])
 		if (tpnt->dynamic_info[DT_PLTGOT])
 # endif
 # endif

+ 1 - 1
ldso/ldso/m68k/dl-sysdep.h

@@ -68,7 +68,7 @@ static inline void
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 		      Elf32_Word relative_count)
 {
 {
-	 Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	 Elf32_Rela * rpnt = (void *)rel_addr;
 	--rpnt;
 	--rpnt;
 	do {
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

+ 9 - 11
ldso/ldso/m68k/elfinterp.c

@@ -69,13 +69,13 @@ _dl_linux_resolver (struct elf_resolve *tpnt, int reloc_entry)
 	char **got_addr;
 	char **got_addr;
 	unsigned int instr_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);
 	this_reloc = (Elf32_Rela *) (rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE (this_reloc->r_info);
 	reloc_type = ELF32_R_TYPE (this_reloc->r_info);
 	symtab_index = ELF32_R_SYM (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)) {
 	if (unlikely(reloc_type != R_68K_JMP_SLOT)) {
 		_dl_dprintf (2, "%s: incorrect relocation type in jump relocations\n",
 		_dl_dprintf (2, "%s: incorrect relocation type in jump relocations\n",
@@ -136,12 +136,11 @@ _dl_parse_lazy_relocation_information(struct dyn_elf *arg_rpnt,
 	struct elf_resolve *tpnt = arg_rpnt->dyn;
 	struct elf_resolve *tpnt = arg_rpnt->dyn;
 
 
 	/* Now parse the relocation information.  */
 	/* Now parse the relocation information.  */
-	rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr);
+	rpnt = (Elf32_Rela *)rel_addr;
 	rel_size = rel_size / sizeof (Elf32_Rela);
 	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++) {
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset);
 		reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset);
@@ -184,12 +183,11 @@ _dl_parse_relocation_information(struct dyn_elf *arg_rpnt,
 	struct elf_resolve *tpnt = arg_rpnt->dyn;
 	struct elf_resolve *tpnt = arg_rpnt->dyn;
 	/* Now parse the relocation information */
 	/* Now parse the relocation information */
 
 
-	rpnt = (Elf32_Rela *) (rel_addr + tpnt->loadaddr);
+	rpnt = (Elf32_Rela *)rel_addr;
 	rel_size = rel_size / sizeof (Elf32_Rela);
 	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++) {
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset);
 		reloc_addr = (int *) (tpnt->loadaddr + (int) rpnt->r_offset);

+ 2 - 2
ldso/ldso/mips/dl-startup.h

@@ -64,8 +64,8 @@ do {										\
 										\
 										\
 	/* Handle global GOT entries */						\
 	/* Handle global GOT entries */						\
 	mipsgot += tpnt->dynamic_info[DT_MIPS_LOCAL_GOTNO_IDX];			\
 	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];\
 	i = tpnt->dynamic_info[DT_MIPS_SYMTABNO_IDX] - tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];\
 										\
 										\
 	while (i--) {								\
 	while (i--) {								\

+ 10 - 12
ldso/ldso/mips/elfinterp.c

@@ -124,8 +124,8 @@ unsigned long _dl_linux_resolver(unsigned long sym_index,
 	gotsym = tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];
 	gotsym = tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];
 	local_gotno = tpnt->dynamic_info[DT_MIPS_LOCAL_GOTNO_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;
 	symname = strtab + sym->st_name;
 
 
 	new_addr = (unsigned long) _dl_find_hash(symname,
 	new_addr = (unsigned long) _dl_find_hash(symname,
@@ -182,11 +182,11 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt,
 
 
 	/* Now parse the relocation information */
 	/* Now parse the relocation information */
 	rel_size = rel_size / sizeof(Elf32_Rel);
 	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++) {
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		reloc_addr = (unsigned long *) (tpnt->loadaddr +
 		reloc_addr = (unsigned long *) (tpnt->loadaddr +
@@ -261,12 +261,10 @@ void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy)
 			continue;
 			continue;
 
 
 		/* Setup the loop variables */
 		/* 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];
 		i = tpnt->dynamic_info[DT_MIPS_SYMTABNO_IDX] - tpnt->dynamic_info[DT_MIPS_GOTSYM_IDX];
 
 
 #if defined (__SUPPORT_LD_DEBUG__)
 #if defined (__SUPPORT_LD_DEBUG__)

+ 1 - 1
ldso/ldso/powerpc/dl-sysdep.h

@@ -158,7 +158,7 @@ static inline void
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 		      Elf32_Word relative_count)
 {
 {
-	 Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	 Elf32_Rela * rpnt = (void *)rel_addr;
 	--rpnt;
 	--rpnt;
 	do {     /* PowerPC handles pre increment/decrement better */ 
 	do {     /* PowerPC handles pre increment/decrement better */ 
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

+ 14 - 16
ldso/ldso/powerpc/elfinterp.c

@@ -181,14 +181,14 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
 	Elf32_Addr  finaladdr;
 	Elf32_Addr  finaladdr;
 	Elf32_Sword delta;
 	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;
 	this_reloc = (void *)rel_addr + reloc_entry;
 	symtab_index = ELF32_R_SYM(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);
-	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__)
 #if defined (__SUPPORT_LD_DEBUG__)
 	debug_sym(symtab,strtab,symtab_index);
 	debug_sym(symtab,strtab,symtab_index);
@@ -229,7 +229,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
 		/* Warning: we don't handle double-sized PLT entries */
 		/* Warning: we don't handle double-sized PLT entries */
 		Elf32_Word *plt, *data_words, index, offset;
 		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;
 		offset = reloc_addr - plt;
 		index = (offset - PLT_INITIAL_ENTRY_WORDS)/2;
 		index = (offset - PLT_INITIAL_ENTRY_WORDS)/2;
 		data_words = (Elf32_Word *)tpnt->data_words;
 		data_words = (Elf32_Word *)tpnt->data_words;
@@ -265,7 +265,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope,
 #endif
 #endif
 	reloc_addr   = (Elf32_Addr *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset);
 	reloc_addr   = (Elf32_Addr *)(intptr_t) (tpnt->loadaddr + (unsigned long) rpnt->r_offset);
 	reloc_type   = ELF32_R_TYPE(rpnt->r_info);
 	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);
 	symtab_index = ELF32_R_SYM(rpnt->r_info);
 	symname      = strtab + symtab[symtab_index].st_name;
 	symname      = strtab + symtab[symtab_index].st_name;
 	if (symtab_index) {
 	if (symtab_index) {
@@ -275,10 +275,8 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope,
 		 * have been intentional.  We should not be linking local symbols
 		 * have been intentional.  We should not be linking local symbols
 		 * here, so all bases should be covered.
 		 * 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__)
 #if defined (__SUPPORT_LD_DEBUG__)
 	old_val = *reloc_addr;
 	old_val = *reloc_addr;
@@ -302,7 +300,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope,
 			/* Warning: we don't handle double-sized PLT entries */
 			/* Warning: we don't handle double-sized PLT entries */
 			Elf32_Word *plt, *data_words, index, offset;
 			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;
 			offset = reloc_addr - plt;
 			index = (offset - PLT_INITIAL_ENTRY_WORDS)/2;
 			index = (offset - PLT_INITIAL_ENTRY_WORDS)/2;
 			data_words = (Elf32_Word *)tpnt->data_words;
 			data_words = (Elf32_Word *)tpnt->data_words;
@@ -349,7 +347,7 @@ _dl_do_reloc (struct elf_resolve *tpnt,struct dyn_elf *scope,
 		}
 		}
 #else
 #else
 		_dl_dprintf(2,"R_PPC_REL24: Compile shared libraries with -fPIC!\n");
 		_dl_dprintf(2,"R_PPC_REL24: Compile shared libraries with -fPIC!\n");
-		_dl_exit(1);
+		return -1;
 #endif
 #endif
 	case R_PPC_NONE:
 	case R_PPC_NONE:
 		goto out_nocode; /* No code code modified */
 		goto out_nocode; /* No code code modified */
@@ -385,7 +383,7 @@ void _dl_parse_lazy_relocation_information(struct dyn_elf *rpnt,
 	num_plt_entries = rel_size / sizeof(ELF_RELOC);
 	num_plt_entries = rel_size / sizeof(ELF_RELOC);
 
 
 	rel_offset_words = PLT_DATA_START_WORDS(num_plt_entries);
 	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.  */
 	/* Set up the lazy PLT entries.  */
 	offset = PLT_INITIAL_ENTRY_WORDS;
 	offset = PLT_INITIAL_ENTRY_WORDS;
@@ -428,11 +426,11 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
 	int symtab_index;
 	int symtab_index;
 
 
 	/* Now parse the relocation information */
 	/* 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);
 	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++) {
 	  for (i = 0; i < rel_size; i++, rpnt++) {
 	        int res;
 	        int res;

+ 0 - 4
ldso/ldso/sh/dl-startup.h

@@ -68,7 +68,3 @@ asm(
  * call the _dl_elf_main function.
  * call the _dl_elf_main function.
  */
  */
 #define START()   return _dl_elf_main;
 #define START()   return _dl_elf_main;
-
-
-
-

+ 1 - 1
ldso/ldso/sh/dl-sysdep.h

@@ -156,7 +156,7 @@ elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 		      Elf32_Word relative_count)
 {
 {
 	Elf32_Addr value;
 	Elf32_Addr value;
-	Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	Elf32_Rela * rpnt = (void *)rel_addr;
 
 
 	do {
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + rpnt->r_offset);
 		Elf32_Addr *const reloc_addr = (void *) (load_off + rpnt->r_offset);

+ 6 - 6
ldso/ldso/sh/elfinterp.c

@@ -126,14 +126,14 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
 	unsigned long instr_addr;
 	unsigned long instr_addr;
 	char *symname;
 	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);
 	this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(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;
 	symname = strtab + symtab[symtab_index].st_name;
 
 
 	if (unlikely(reloc_type != R_SH_JMP_SLOT)) {
 	if (unlikely(reloc_type != R_SH_JMP_SLOT)) {
@@ -189,11 +189,11 @@ _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
 	int symtab_index;
 	int symtab_index;
 	/* Now parse the relocation information */
 	/* 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);
 	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++) {
 	  for (i = 0; i < rel_size; i++, rpnt++) {
 	        int res;
 	        int res;

+ 1 - 1
ldso/ldso/sh64/dl-sysdep.h

@@ -100,7 +100,7 @@ elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 		      Elf32_Word relative_count)
 {
 {
 	Elf32_Addr value;
 	Elf32_Addr value;
-	Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	Elf32_Rela * rpnt = (void *)rel_addr;
 
 
 	do {
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + rpnt->r_offset);
 		Elf32_Addr *const reloc_addr = (void *) (load_off + rpnt->r_offset);

+ 6 - 8
ldso/ldso/sh64/elfinterp.c

@@ -166,15 +166,14 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
 	unsigned long instr_addr;
 	unsigned long instr_addr;
 	char *symname;
 	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);
 	this_reloc = (ELF_RELOC *)(intptr_t)(rel_addr + reloc_entry);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	reloc_type = ELF32_R_TYPE(this_reloc->r_info);
 	symtab_index = ELF32_R_SYM(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;
 	symname = strtab + symtab[symtab_index].st_name;
 
 
 	if (unlikely(reloc_type != R_SH_JMP_SLOT)) {
 	if (unlikely(reloc_type != R_SH_JMP_SLOT)) {
@@ -233,12 +232,11 @@ static int _dl_parse(struct elf_resolve *tpnt, struct dyn_elf *scope,
 	int symtab_index;
 	int symtab_index;
 
 
 	/* Now parse the relocation information */
 	/* 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);
 	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++) {
 	for (i = 0; i < rel_size; i++, rpnt++) {
 		int res;
 		int res;

+ 1 - 1
ldso/ldso/sparc/dl-sysdep.h

@@ -160,7 +160,7 @@ static inline void
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 elf_machine_relative (Elf32_Addr load_off, const Elf32_Addr rel_addr,
 		      Elf32_Word relative_count)
 		      Elf32_Word relative_count)
 {
 {
-	 Elf32_Rela * rpnt = (void *) (rel_addr + load_off);
+	 Elf32_Rela * rpnt = (void *)rel_addr;
 	--rpnt;
 	--rpnt;
 	do {
 	do {
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);
 		Elf32_Addr *const reloc_addr = (void *) (load_off + (++rpnt)->r_offset);

+ 9 - 10
ldso/ldso/sparc/elfinterp.c

@@ -66,8 +66,7 @@ unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt)
   unsigned int instr_addr;
   unsigned int instr_addr;
   tpnt = (struct elf_resolve *) plt[2];
   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.
    * Generate the correct relocation index into the .rela.plt section.
@@ -79,8 +78,8 @@ unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt)
   reloc_type = ELF32_R_TYPE(this_reloc->r_info);
   reloc_type = ELF32_R_TYPE(this_reloc->r_info);
   symtab_index = ELF32_R_SYM(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__
 #ifdef __SUPPORT_LD_DEBUG__
   if (_dl_debug_symbols) {
   if (_dl_debug_symbols) {
@@ -159,10 +158,10 @@ void _dl_parse_lazy_relocation_information(struct dyn_elf *arg_rpnt,
   struct elf_resolve * tpnt = arg_rpnt->dyn;
   struct elf_resolve * tpnt = arg_rpnt->dyn;
 
 
   /* Now parse the relocation information */
   /* 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++){
   for(i=0; i< rel_size; i += sizeof(Elf32_Rela), rpnt++){
     reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset);
     reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset);
@@ -201,10 +200,10 @@ int _dl_parse_relocation_information(struct dyn_elf *arg_rpnt,
   struct elf_resolve * tpnt = arg_rpnt->dyn;
   struct elf_resolve * tpnt = arg_rpnt->dyn;
   /* Now parse the relocation information */
   /* 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++){
   for(i=0; i< rel_size; i+= sizeof(Elf32_Rela), rpnt++){
     reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset);
     reloc_addr = (int *) (tpnt->loadaddr + (int)rpnt->r_offset);

+ 3 - 3
ldso/libdl/libdl.c

@@ -212,7 +212,7 @@ void *dlopen(const char *libname, int flag)
 			if (dpnt->d_tag == DT_NEEDED) {
 			if (dpnt->d_tag == DT_NEEDED) {
 				char *name;
 				char *name;
 
 
-				lpntstr = (char*) (tcurr->loadaddr + tcurr->dynamic_info[DT_STRTAB] +
+				lpntstr = (char*) (tcurr->dynamic_info[DT_STRTAB] +
 						dpnt->d_un.d_val);
 						dpnt->d_un.d_val);
 				name = _dl_get_last_path_component(lpntstr);
 				name = _dl_get_last_path_component(lpntstr);
 				tpnt1 = _dl_check_if_named_library_is_loaded(name, 0);
 				tpnt1 = _dl_check_if_named_library_is_loaded(name, 0);
@@ -640,8 +640,8 @@ int dladdr(const void *__address, Dl_info * __info)
 		ElfW(Addr) sa;
 		ElfW(Addr) sa;
 
 
 		sa = 0;
 		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;
 		sf = 0;
 		for (hn = 0; hn < pelf->nbucket; hn++) {
 		for (hn = 0; hn < pelf->nbucket; hn++) {