mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 23:00:07 +00:00
x86: Check IFUNC definition in unrelocated executable [BZ #20019]
Calling an IFUNC function defined in unrelocated executable also leads to segfault. Issue a fatal error message when calling IFUNC function defined in the unrelocated executable from a shared library.
This commit is contained in:
parent
b47b07c92d
commit
6ea5b57afa
@ -337,16 +337,22 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
||||
{
|
||||
# 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_error_printf ("\
|
||||
if (sym_map->l_type == lt_executable)
|
||||
_dl_fatal_printf ("\
|
||||
%s: IFUNC symbol '%s' referenced in '%s' is defined in the executable \
|
||||
and creates an unsatisfiable circular dependency.\n",
|
||||
RTLD_PROGNAME, strtab + refsym->st_name,
|
||||
map->l_name);
|
||||
else
|
||||
_dl_error_printf ("\
|
||||
%s: Relink `%s' with `%s' for IFUNC symbol `%s'\n",
|
||||
RTLD_PROGNAME, map->l_name,
|
||||
sym_map->l_name,
|
||||
strtab + refsym->st_name);
|
||||
RTLD_PROGNAME, map->l_name,
|
||||
sym_map->l_name,
|
||||
strtab + refsym->st_name);
|
||||
}
|
||||
# endif
|
||||
value = ((Elf32_Addr (*) (void)) value) ();
|
||||
|
@ -314,16 +314,22 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
|
||||
{
|
||||
# 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_error_printf ("\
|
||||
if (sym_map->l_type == lt_executable)
|
||||
_dl_fatal_printf ("\
|
||||
%s: IFUNC symbol '%s' referenced in '%s' is defined in the executable \
|
||||
and creates an unsatisfiable circular dependency.\n",
|
||||
RTLD_PROGNAME, strtab + refsym->st_name,
|
||||
map->l_name);
|
||||
else
|
||||
_dl_error_printf ("\
|
||||
%s: Relink `%s' with `%s' for IFUNC symbol `%s'\n",
|
||||
RTLD_PROGNAME, map->l_name,
|
||||
sym_map->l_name,
|
||||
strtab + refsym->st_name);
|
||||
RTLD_PROGNAME, map->l_name,
|
||||
sym_map->l_name,
|
||||
strtab + refsym->st_name);
|
||||
}
|
||||
# endif
|
||||
value = ((ElfW(Addr) (*) (void)) value) ();
|
||||
|
Loading…
Reference in New Issue
Block a user