Fix R_PPC64_{JMP_IREL,IRELATIVE} handling in dl-conflict.c.

I've just committed STT_GNU_IFUNC ppc/ppc64 support into prelink,
and this patch is needed on the glibc side.  Without it ld.so segfaults,
as in dl-conflict.c sym_map is always NULL.  While dl-machine.h could use
RESOLVE_CONFLICT_FIND_MAP macro to compute it, it doesn't make sense,
because with prelink we know it is already properly relocated (all relative
relocations are applied by prelink).
This commit is contained in:
Jakub Jelinek 2009-11-06 09:27:41 -08:00 committed by Ulrich Drepper
parent 34df851b33
commit 872873d48d
2 changed files with 9 additions and 2 deletions

View file

@ -1,3 +1,8 @@
2009-11-03 Jakub Jelinek <jakub@redhat.com>
* sysdeps/powerpc/powerpc64/dl-machine.h (resolve_ifunc): Don't
relocate opd entry when resolving prelink conflicts.
2009-11-04 Jakub Jelinek <jakub@redhat.com>
* misc/sys/uio.h (preadv, pwritev): Fix type of last argument

View file

@ -531,13 +531,14 @@ auto inline Elf64_Addr __attribute__ ((always_inline))
resolve_ifunc (Elf64_Addr value,
const struct link_map *map, const struct link_map *sym_map)
{
#ifndef RESOLVE_CONFLICT_FIND_MAP
/* The function we are calling may not yet have its opd entry relocated. */
Elf64_FuncDesc opd;
if (map != sym_map
#if !defined RTLD_BOOTSTRAP && defined SHARED
# if !defined RTLD_BOOTSTRAP && defined SHARED
/* Bootstrap map doesn't have l_relocated set for it. */
&& sym_map != &GL(dl_rtld_map)
#endif
# endif
&& !sym_map->l_relocated)
{
Elf64_FuncDesc *func = (Elf64_FuncDesc *) value;
@ -546,6 +547,7 @@ resolve_ifunc (Elf64_Addr value,
opd.fd_aux = func->fd_aux;
value = (Elf64_Addr) &opd;
}
#endif
return ((Elf64_Addr (*) (void)) value) ();
}