mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
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:
parent
34df851b33
commit
872873d48d
@ -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
|
||||
|
@ -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) ();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user