diff options
Diffstat (limited to 'toolchain/glibc/patches/2.25/sh.patch')
-rw-r--r-- | toolchain/glibc/patches/2.25/sh.patch | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/toolchain/glibc/patches/2.25/sh.patch b/toolchain/glibc/patches/2.25/sh.patch new file mode 100644 index 000000000..fa43bddc8 --- /dev/null +++ b/toolchain/glibc/patches/2.25/sh.patch @@ -0,0 +1,56 @@ +From 3840d4c2add1dd282f5f01fa51720b2d5b8fd8d2 Mon Sep 17 00:00:00 2001 +From: Alexey Neyman <stilor@att.net> +Date: Wed, 8 Feb 2017 16:00:57 -0200 +Subject: [PATCH] sh: Fix building with gcc5/6 + +Build glibc for sh4-unknown-linux-gnu currently fails if one's +using GCC5/6: in dl-conflict.c, the elf_machine_rela() function +is called with NULL as its 3rd argument, sym. The implementation +of that function in sysdeps/sh/dl-machine.h dereferences that pointer: + +const Elf32_Sym *const refsym = sym; +... +if (map == &GL(dl_rtld_map)) + value -= map->l_addr + refsym->st_value + reloc->r_addend; + +GCC discovers a null pointer dereference, and in accordance with +-fdelete-null-pointer-checks (which is enabled in -O2) replaces this +code with a trap - which, as SH does not implement a trap pattern in +GCC, evaluates to an abort() call. This abort() call pulls many more +objects from libc_nonshared.a, eventually resulting in link failure +due to multiple definitions for a number of symbols. + +As far as I see, the conditional before this code is always false in +rtld: _dl_resolve_conflicts() is called with main_map as the first +argument, not GL(_dl_rtld_map), but since that call is in yet another +compilation unit, GCC does not know about it. Patch that wraps this +conditional into !defined RESOLVE_CONFLICT_FIND_MAP attached. + + * sysdeps/sh/dl-machine.h (elf_machine_rela): The condition + in R_SH_DIR32 case is always false when inlined from + dl-conflict.c. Ifdef out to prevent GCC from insertin an + abort() call. + +[Waldemar: backport of +https://sourceware.org/git/?p=glibc.git;a=commit;h=d40dbe722f004f999b589de776f7e57e564dda01.] +Signed-off-by: Waldemar Brodkorb <wbx@openadk.org> +--- + sysdeps/sh/dl-machine.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sysdeps/sh/dl-machine.h b/sysdeps/sh/dl-machine.h +index 449deea..2b468af 100644 +--- a/sysdeps/sh/dl-machine.h ++++ b/sysdeps/sh/dl-machine.h +@@ -389,7 +389,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + break; + case R_SH_DIR32: + { +-#ifndef RTLD_BOOTSTRAP ++#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP + /* This is defined in rtld.c, but nowhere in the static + libc.a; make the reference weak so static programs can + still link. This declaration cannot be done when +-- +2.7.4 + |