diff options
Diffstat (limited to 'elf/dl-runtime.c')
-rw-r--r-- | elf/dl-runtime.c | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index 8ee1838df9..46c0e1b8ab 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -87,6 +87,10 @@ _dl_object_relocation_scope (struct link_map *l) # define VERSYMIDX(sym) (DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (sym)) #endif +#ifndef ELF_FIXUP_RETURN_VALUE +#define ELF_FIXUP_RETURN_VALUE(map, result) (result) +#endif + /* We need to define the function as a local symbol so that the reference in the trampoline code will be a local PC-relative call. Tell the compiler not to worry that the function appears not to be called. */ @@ -120,6 +124,7 @@ fixup ( const PLTREL *const reloc = (const void *) (l->l_addr + l->l_info[DT_JMPREL]->d_un.d_ptr + reloc_offset); + ElfW(Addr) *const rel_addr = (ElfW(Addr) *)(l->l_addr + reloc->r_offset); /* Set up the scope to find symbols referenced by this object. */ struct link_map **scope = _dl_object_relocation_scope (l); @@ -144,21 +149,17 @@ fixup ( elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)], &l->l_versions[ndx], - (void *) (l->l_addr + reloc->r_offset)); + (void *) rel_addr); } else elf_machine_relplt (l, reloc, &symtab[ELFW(R_SYM) (reloc->r_info)], - NULL, (void *) (l->l_addr + reloc->r_offset)); + NULL, (void *) rel_addr); } *_dl_global_scope_end = NULL; /* Return the address that was written by the relocation. */ -#ifdef ELF_FIXUP_RETURNS_ADDRESS - return (ElfW(Addr))(l->l_addr + reloc->r_offset); -#else - return *(ElfW(Addr) *) (l->l_addr + reloc->r_offset); -#endif + return ELF_FIXUP_RETURN_VALUE(l, *rel_addr); } @@ -219,17 +220,10 @@ profile_fixup ( } *_dl_global_scope_end = NULL; - - /* Return the address that was written by the relocation. */ -#ifdef ELF_FIXUP_RETURNS_ADDRESS (*mcount_fct) (retaddr, result); - return &result; /* XXX This cannot work. What to do??? --drepper */ -#else - (*mcount_fct) (retaddr, result); - - return result; -#endif + /* Return the address that was written by the relocation. */ + return ELF_FIXUP_RETURN_VALUE(l, result); } #endif |