diff options
author | Alexey Brodkin <abrodkin@synopsys.com> | 2021-09-11 04:33:31 -0700 |
---|---|---|
committer | Alexey Brodkin <abrodkin@synopsys.com> | 2021-09-13 01:57:39 -0700 |
commit | 2160d68291460d0f31bab8aab38b22838a857144 (patch) | |
tree | 469641c7bddc0c9b623e5b4c5cf05d968d0ce8e5 /packages/binutils | |
parent | 3b97480638286acceb2ea9877ed4a4e3204fbd18 (diff) | |
download | crosstool-ng-2160d68291460d0f31bab8aab38b22838a857144.tar.gz crosstool-ng-2160d68291460d0f31bab8aab38b22838a857144.tar.bz2 crosstool-ng-2160d68291460d0f31bab8aab38b22838a857144.zip |
binutils 2.37: arc: Fix for 32-bit hosts
While building statically-linked executables for ARC on 32-bit platform
LD segfaulted like that:
--------------------------->8-------------------------
$ gcc test.c -static
potentially unexpected fatal signal 11.
Path: /arc_gnu_2021.03_prebuilt_glibc_le_archs_native_install/arc-snps-linux-gnu/bin/ld
CPU: 0 PID: 79 Comm: ld Not tainted 5.10.43 #8
Invalid Read @ 0x00000020 by insn @ 0x40bbe
@off 0x40bbe in [/arc_gnu_2021.03_prebuilt_glibc_le_archs_native_install/arc-snps-linux-gnu/bin/ld] VMA: 0x00010000 to 0x0010e000
ECR: 0x00050100 EFA: 0x00000020 ERET: 0x00040bbe
STAT: 0x80080082 [IE U ] BTA: 0x0003fc24
SP: 0x5fdb8dec FP: 0x00129598 BLK: 0x40b66
LPS: 0x2008c602 LPE: 0x2008c63e LPC: 0x00000001
r00: 0x008392f2 r01: 0x00000001 r02: 0x00000000
r03: 0x008392f2 r04: 0x00000058 r05: 0x00e37e88
r06: 0x00eb8ea8 r07: 0x00a837e8 r08: 0x0000003f
r09: 0x736e7520 r10: 0x2011aa74 r11: 0x001147f4
r12: 0x00a83834 r13: 0x00a837e8 r14: 0x00ce92b8
r15: 0x00112130 r16: 0x00eb8ea8 r17: 0x00000058
r18: 0x001273b8 r19: 0x00e37e88 r20: 0x00129598
r21: 0x5fdb8e74 r22: 0x00112130 r23: 0x00179bb0
r24: 0x00170684 r25: 0x20122490
collect2: fatal error: ld terminated with signal 11 [Segmentation fault]
compilation terminated.
--------------------------->8-------------------------
Originally found during native building on ARC board, but later
re-produced on other 32-bit systems like i386/i586.
For all the gory details please refer to [1].
Original fix could be found here [2].
[1] https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/issues/402
[2] https://github.com/foss-for-synopsys-dwc-arc-processors/binutils-gdb/commit/29d31b4ed96fcbc774740fac91ef77cb3d62a714
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Diffstat (limited to 'packages/binutils')
-rw-r--r-- | packages/binutils/2.37/0009-arc-Fix-potential-invalid-pointer-access-when-fixing.patch | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/packages/binutils/2.37/0009-arc-Fix-potential-invalid-pointer-access-when-fixing.patch b/packages/binutils/2.37/0009-arc-Fix-potential-invalid-pointer-access-when-fixing.patch new file mode 100644 index 00000000..ade3180b --- /dev/null +++ b/packages/binutils/2.37/0009-arc-Fix-potential-invalid-pointer-access-when-fixing.patch @@ -0,0 +1,217 @@ +From 29d31b4ed96fcbc774740fac91ef77cb3d62a714 Mon Sep 17 00:00:00 2001 +From: Claudiu Zissulescu <claziss@synopsys.com> +Date: Tue, 17 Aug 2021 13:44:17 +0300 +Subject: [PATCH] arc: Fix potential invalid pointer access when fixing got + symbols. + +When statically linking, it can arrive to an undefined weak symbol of +which its value cannot be determined. However, we are having pieces of +code which doesn't take this situation into account, leading to access +a structure which may not be initialized. Fix this situation and add a +test. + +bfd/ +xxxx-xx-xx Cupertino Miranda <cmiranda@synopsys.com> + Claudiu Zissulescu <claziss@synopsys.com> + + * arc-got.h (arc_static_sym_data): New structure. + (get_static_sym_data): New function. + (relocate_fix_got_relocs_for_got_info): Move the computation fo + symbol value and section to above introduced function, and use + this new function. + +ld/testsuite/ +xxxx-xx-xx Claudiu Zissulescu <claziss@synopsys.com> + + * ld-arc/got-weak.d: New file. + * ld-arc/got-weak.s: Likewise. + +For all the gory details please refer to [1]. +Original fix could be found here [2]. + +[1] https://github.com/foss-for-synopsys-dwc-arc-processors/toolchain/issues/402 +[2] https://github.com/foss-for-synopsys-dwc-arc-processors/binutils-gdb/commit/29d31b4ed96fcbc774740fac91ef77cb3d62a714 + +Signed-off-by: Claudiu Zissulescu <claziss@synopsys.com> +[Added links to the origins] +Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> +--- + bfd/arc-got.h | 94 ++++++++++++++++++++++++----------------- + ld/testsuite/ld-arc/got-weak.d | 12 +++++ + ld/testsuite/ld-arc/got-weak.s | 7 +++ + 3 files changed, 76 insertions(+), 37 deletions(-) + create mode 100644 ld/testsuite/ld-arc/got-weak.d + create mode 100644 ld/testsuite/ld-arc/got-weak.s + +--- a/bfd/arc-got.h ++++ b/bfd/arc-got.h +@@ -262,6 +262,48 @@ + return true; + } + ++struct arc_static_sym_data { ++ bfd_vma sym_value; ++ const char *symbol_name; ++}; ++ ++static struct arc_static_sym_data ++get_static_sym_data (unsigned long r_symndx, ++ Elf_Internal_Sym *local_syms, ++ asection **local_sections, ++ struct elf_link_hash_entry *h, ++ struct arc_relocation_data *reloc_data) ++{ ++ static const char local_name[] = "(local)"; ++ struct arc_static_sym_data ret = { 0, NULL }; ++ ++ if (h != NULL) ++ { ++ BFD_ASSERT (h->root.type != bfd_link_hash_undefweak ++ && h->root.type != bfd_link_hash_undefined); ++ /* TODO: This should not be here. */ ++ reloc_data->sym_value = h->root.u.def.value; ++ reloc_data->sym_section = h->root.u.def.section; ++ ++ ret.sym_value = h->root.u.def.value ++ + h->root.u.def.section->output_section->vma ++ + h->root.u.def.section->output_offset; ++ ++ ret.symbol_name = h->root.root.string; ++ } ++ else ++ { ++ Elf_Internal_Sym *sym = local_syms + r_symndx; ++ asection *sec = local_sections[r_symndx]; ++ ++ ret.sym_value = sym->st_value ++ + sec->output_section->vma ++ + sec->output_offset; ++ ++ ret.symbol_name = local_name; ++ } ++ return ret; ++} + + static bfd_vma + relocate_fix_got_relocs_for_got_info (struct got_entry ** list_p, +@@ -290,38 +332,7 @@ + && SYMBOL_REFERENCES_LOCAL (info, h)))) + { + const char ATTRIBUTE_UNUSED *symbol_name; +- static const char local_name[] = "(local)"; +- asection *tls_sec = NULL; +- bfd_vma sym_value = 0; +- +- if (h != NULL) +- { +- /* TODO: This should not be here. */ +- reloc_data->sym_value = h->root.u.def.value; +- reloc_data->sym_section = h->root.u.def.section; +- +- sym_value = h->root.u.def.value +- + h->root.u.def.section->output_section->vma +- + h->root.u.def.section->output_offset; +- +- tls_sec = elf_hash_table (info)->tls_sec; +- +- symbol_name = h->root.root.string; +- } +- else +- { +- Elf_Internal_Sym *sym = local_syms + r_symndx; +- asection *sec = local_sections[r_symndx]; +- +- sym_value = sym->st_value +- + sec->output_section->vma +- + sec->output_offset; +- +- tls_sec = elf_hash_table (info)->tls_sec; +- +- symbol_name = local_name; +- } +- ++ asection *tls_sec = elf_hash_table (info)->tls_sec; + + if (entry && !entry->processed) + { +@@ -335,8 +346,12 @@ + if (h == NULL || h->forced_local + || !elf_hash_table (info)->dynamic_sections_created) + { ++ struct arc_static_sym_data tmp = ++ get_static_sym_data (r_symndx, local_syms, local_sections, ++ h, reloc_data); ++ + bfd_put_32 (output_bfd, +- sym_value - sec_vma ++ tmp.sym_value - sec_vma + + (elf_hash_table (info)->dynamic_sections_created + ? 0 + : (align_power (0, +@@ -355,7 +370,7 @@ + + entry->offset + + (entry->existing_entries == TLS_GOT_MOD_AND_OFF + ? 4 : 0)), +- symbol_name); ++ tmp.symbol_name); + } + } + break; +@@ -366,8 +381,12 @@ + bfd_vma ATTRIBUTE_UNUSED sec_vma + = tls_sec->output_section->vma; + ++ struct arc_static_sym_data tmp = ++ get_static_sym_data (r_symndx, local_syms, local_sections, ++ h, reloc_data); ++ + bfd_put_32 (output_bfd, +- sym_value - sec_vma ++ tmp.sym_value - sec_vma + + (elf_hash_table (info)->dynamic_sections_created + ? 0 + : (align_power (TCB_SIZE, +@@ -386,7 +405,7 @@ + + entry->offset + + (entry->existing_entries == TLS_GOT_MOD_AND_OFF + ? 4 : 0)), +- symbol_name); ++ tmp.symbol_name); + } + break; + +@@ -415,7 +434,8 @@ + "@ %#08lx for sym %s in got offset %#lx\n", + (long) (reloc_data->sym_value + sec_vma), + (long) (htab->sgot->output_section->vma +- + htab->sgot->output_offset + entry->offset), ++ + htab->sgot->output_offset ++ + entry->offset), + symbol_name, + (long) entry->offset); + } +--- /dev/null ++++ b/ld/testsuite/ld-arc/got-weak.d +@@ -0,0 +1,12 @@ ++#source: got-weak.s ++#as: ++#ld: -Bstatic ++#objdump: -d ++ ++[^:]*: file format elf32-.*arc ++ ++ ++Disassembly of section \.text: ++ ++00000100 <.*>: ++ 100: 2730 7f80 0000 2014 ld r0,\[pcl,0x2014\].* +--- /dev/null ++++ b/ld/testsuite/ld-arc/got-weak.s +@@ -0,0 +1,7 @@ ++ .cpu archs ++ ++ .weak symb ++ .global __start ++ .text ++__start: ++ ld r0,[pcl,@symb@gotpc] |