From e6816a15ab7d7dbf3ffe75a9a22b4a37909aaf57 Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Tue, 29 Mar 2005 13:47:21 +0000 Subject: 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. --- ldso/ldso/mips/dl-startup.h | 4 ++-- ldso/ldso/mips/elfinterp.c | 22 ++++++++++------------ 2 files changed, 12 insertions(+), 14 deletions(-) (limited to 'ldso/ldso/mips') diff --git a/ldso/ldso/mips/dl-startup.h b/ldso/ldso/mips/dl-startup.h index 0e9cb1856..f369f77f1 100644 --- a/ldso/ldso/mips/dl-startup.h +++ b/ldso/ldso/mips/dl-startup.h @@ -64,8 +64,8 @@ do { \ \ /* 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--) { \ diff --git a/ldso/ldso/mips/elfinterp.c b/ldso/ldso/mips/elfinterp.c index 39a147df0..c551d6ca4 100644 --- a/ldso/ldso/mips/elfinterp.c +++ b/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]; 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 @@ int _dl_parse_relocation_information(struct dyn_elf *xpnt, /* 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 @@ void _dl_perform_mips_global_got_relocations(struct elf_resolve *tpnt, int lazy) 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__) -- cgit v1.2.3