From 6fab532b4781b0bcb554fd5c2f2e6d5448343aff Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 2 Feb 2017 13:14:43 -0800 Subject: [PATCH] Allow IFUNC relocation against unrelocated shared library IFUNC relocation against definition in unrelocated shared library will lead to segfault when the IFUNC function is called. This patch allows such IFUNC relocations with a warning. This isn't a real fix for https://sourceware.org/bugzilla/show_bug.cgi?id=21041 It simply allows the program to load. The program will segfault when longjmp is called. * sysdeps/i386/dl-machine.h (elf_machine_rel): Replace _dl_fatal_printf with _dl_error_printf for IFUNC relocation against unrelocated shared library. * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Likewise. --- ChangeLog | 7 +++++++ sysdeps/i386/dl-machine.h | 2 +- sysdeps/x86_64/dl-machine.h | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index a210e63..9b5b2eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2017-02-02 H.J. Lu + + * sysdeps/i386/dl-machine.h (elf_machine_rel): Replace + _dl_fatal_printf with _dl_error_printf for IFUNC relocation + against unrelocated shared library. + * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Likewise. + 2017-02-02 Siddhesh Poyarekar * sysdeps/generic/unsecvars.h: Add GLIBC_TUNABLES. diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h index 6eca69d..99a72f6 100644 --- a/sysdeps/i386/dl-machine.h +++ b/sysdeps/i386/dl-machine.h @@ -329,7 +329,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, { const char *strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]); - _dl_fatal_printf ("\ + _dl_error_printf ("\ %s: Relink `%s' with `%s' for IFUNC symbol `%s'\n", RTLD_PROGNAME, map->l_name, sym_map->l_name, diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h index 3e7ae22..daf4d8c 100644 --- a/sysdeps/x86_64/dl-machine.h +++ b/sysdeps/x86_64/dl-machine.h @@ -339,7 +339,7 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc, { const char *strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]); - _dl_fatal_printf ("\ + _dl_error_printf ("\ %s: Relink `%s' with `%s' for IFUNC symbol `%s'\n", RTLD_PROGNAME, map->l_name, sym_map->l_name, -- 2.7.4