From a384ce7d4b8485460d342ee54cfee491fc11a5a4 Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Sat, 25 Feb 2017 02:37:14 +0100 Subject: [PATCH] binutils: fix for ld segfault for microblaze when --gc-sections is used The workarounds for kmod/libnss can be removed when the patch is applied and the autobuilder toolchains got rebuild. kmod: 0d81107f021bf2a663f102bace1e3f9590641170 libnss: fceb1afd5dda45cf180f22877a6ab0e51d1b3dac Signed-off-by: Waldemar Brodkorb Signed-off-by: Thomas Petazzoni --- .../2.25.1/916-microblaze-pr21180.patch | 33 +++++++++++++++++++ .../2.26.1/0906-microblaze-pr21180.patch | 33 +++++++++++++++++++ .../2.27/0906-microblaze-pr21180.patch | 33 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 package/binutils/2.25.1/916-microblaze-pr21180.patch create mode 100644 package/binutils/2.26.1/0906-microblaze-pr21180.patch create mode 100644 package/binutils/2.27/0906-microblaze-pr21180.patch diff --git a/package/binutils/2.25.1/916-microblaze-pr21180.patch b/package/binutils/2.25.1/916-microblaze-pr21180.patch new file mode 100644 index 0000000000..2ffae49f62 --- /dev/null +++ b/package/binutils/2.25.1/916-microblaze-pr21180.patch @@ -0,0 +1,33 @@ +Fix ld segfault for microblaze when --gc-sections is used +Upstream: pending +https://sourceware.org/bugzilla/show_bug.cgi?id=21180 + +Signed-off-by: Waldemar Brodkorb + +diff -Nur binutils-2.25.1.orig/bfd/elf32-microblaze.c binutils-2.25.1/bfd/elf32-microblaze.c +--- binutils-2.25.1.orig/bfd/elf32-microblaze.c 2015-07-21 10:20:58.000000000 +0200 ++++ binutils-2.25.1/bfd/elf32-microblaze.c 2017-02-23 19:43:24.560776208 +0100 +@@ -3297,13 +3297,20 @@ + && h->def_regular) + { + asection *sec = h->root.u.def.section; ++ bfd_vma value; ++ ++ value = h->root.u.def.value; ++ if (sec->output_section != NULL) ++ /* PR 21180: If the output section is NULL, then the symbol is no ++ longer needed, and in theory the GOT entry is redundant. But ++ it is too late to change our minds now... */ ++ value += sec->output_section->vma + sec->output_offset; ++ + microblaze_elf_output_dynamic_relocation (output_bfd, + srela, srela->reloc_count++, + /* symindex= */ 0, + R_MICROBLAZE_REL, offset, +- h->root.u.def.value +- + sec->output_section->vma +- + sec->output_offset); ++ value); + } + else + { diff --git a/package/binutils/2.26.1/0906-microblaze-pr21180.patch b/package/binutils/2.26.1/0906-microblaze-pr21180.patch new file mode 100644 index 0000000000..8104db3462 --- /dev/null +++ b/package/binutils/2.26.1/0906-microblaze-pr21180.patch @@ -0,0 +1,33 @@ +Fix ld segfault for microblaze when --gc-sections is used +Upstream: pending +https://sourceware.org/bugzilla/show_bug.cgi?id=21180 + +Signed-off-by: Waldemar Brodkorb + +diff -Nur binutils-2.26.1.orig/bfd/elf32-microblaze.c binutils-2.26.1/bfd/elf32-microblaze.c +--- binutils-2.26.1.orig/bfd/elf32-microblaze.c 2015-11-13 09:27:40.000000000 +0100 ++++ binutils-2.26.1/bfd/elf32-microblaze.c 2017-02-23 19:43:18.536542964 +0100 +@@ -3300,13 +3300,20 @@ + && h->def_regular) + { + asection *sec = h->root.u.def.section; ++ bfd_vma value; ++ ++ value = h->root.u.def.value; ++ if (sec->output_section != NULL) ++ /* PR 21180: If the output section is NULL, then the symbol is no ++ longer needed, and in theory the GOT entry is redundant. But ++ it is too late to change our minds now... */ ++ value += sec->output_section->vma + sec->output_offset; ++ + microblaze_elf_output_dynamic_relocation (output_bfd, + srela, srela->reloc_count++, + /* symindex= */ 0, + R_MICROBLAZE_REL, offset, +- h->root.u.def.value +- + sec->output_section->vma +- + sec->output_offset); ++ value); + } + else + { diff --git a/package/binutils/2.27/0906-microblaze-pr21180.patch b/package/binutils/2.27/0906-microblaze-pr21180.patch new file mode 100644 index 0000000000..48e5e14b45 --- /dev/null +++ b/package/binutils/2.27/0906-microblaze-pr21180.patch @@ -0,0 +1,33 @@ +Fix ld segfault for microblaze when --gc-sections is used +Upstream: pending +https://sourceware.org/bugzilla/show_bug.cgi?id=21180 + +Signed-off-by: Waldemar Brodkorb + +diff -Nur binutils-2.27.orig/bfd/elf32-microblaze.c binutils-2.27/bfd/elf32-microblaze.c +--- binutils-2.27.orig/bfd/elf32-microblaze.c 2016-08-03 09:36:50.000000000 +0200 ++++ binutils-2.27/bfd/elf32-microblaze.c 2017-02-23 19:43:12.612313590 +0100 +@@ -3297,13 +3297,20 @@ + || h->dynindx == -1)) + { + asection *sec = h->root.u.def.section; ++ bfd_vma value; ++ ++ value = h->root.u.def.value; ++ if (sec->output_section != NULL) ++ /* PR 21180: If the output section is NULL, then the symbol is no ++ longer needed, and in theory the GOT entry is redundant. But ++ it is too late to change our minds now... */ ++ value += sec->output_section->vma + sec->output_offset; ++ + microblaze_elf_output_dynamic_relocation (output_bfd, + srela, srela->reloc_count++, + /* symindex= */ 0, + R_MICROBLAZE_REL, offset, +- h->root.u.def.value +- + sec->output_section->vma +- + sec->output_offset); ++ value); + } + else + { -- 2.30.2