mirror of git://sourceware.org/git/glibc.git
Check IFUNC definition in unrelocated shared library [BZ #20019]
Calling an IFUNC function defined in unrelocated shared library may lead to segfault. This patch issues an error message to request relinking the shared library if it references IFUNC function defined in the unrelocated shared library. [BZ #20019] * sysdeps/i386/dl-machine.h (elf_machine_rel): Check IFUNC definition in unrelocated shared library. * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Likewise.
This commit is contained in:
parent
6b1df8b27f
commit
0e6d3adc60
|
@ -1,3 +1,10 @@
|
|||
2016-10-28 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
[BZ #20019]
|
||||
* sysdeps/i386/dl-machine.h (elf_machine_rel): Check IFUNC
|
||||
definition in unrelocated shared library.
|
||||
* sysdeps/x86_64/dl-machine.h (elf_machine_rela): Likewise.
|
||||
|
||||
2016-10-28 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
[BZ #20729]
|
||||
|
|
|
@ -321,7 +321,23 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
|||
0)
|
||||
&& __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)
|
||||
&& __builtin_expect (!skip_ifunc, 1))
|
||||
value = ((Elf32_Addr (*) (void)) value) ();
|
||||
{
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
if (sym_map != map
|
||||
&& sym_map->l_type != lt_executable
|
||||
&& !sym_map->l_relocated)
|
||||
{
|
||||
const char *strtab
|
||||
= (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_fatal_printf ("\
|
||||
%s: Relink `%s' with `%s' for IFUNC symbol `%s'\n",
|
||||
RTLD_PROGNAME, map->l_name,
|
||||
sym_map->l_name,
|
||||
strtab + refsym->st_name);
|
||||
}
|
||||
# endif
|
||||
value = ((Elf32_Addr (*) (void)) value) ();
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
{
|
||||
|
|
|
@ -331,7 +331,23 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
|
|||
0)
|
||||
&& __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)
|
||||
&& __builtin_expect (!skip_ifunc, 1))
|
||||
value = ((ElfW(Addr) (*) (void)) value) ();
|
||||
{
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
if (sym_map != map
|
||||
&& sym_map->l_type != lt_executable
|
||||
&& !sym_map->l_relocated)
|
||||
{
|
||||
const char *strtab
|
||||
= (const char *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
_dl_fatal_printf ("\
|
||||
%s: Relink `%s' with `%s' for IFUNC symbol `%s'\n",
|
||||
RTLD_PROGNAME, map->l_name,
|
||||
sym_map->l_name,
|
||||
strtab + refsym->st_name);
|
||||
}
|
||||
# endif
|
||||
value = ((ElfW(Addr) (*) (void)) value) ();
|
||||
}
|
||||
|
||||
switch (r_type)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue