mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-21 05:43:09 +00:00
86c2982568
This refreshes the line numbers, removes any fuzz (which would make any future forward ports easier) and standardizes the patch/file headers (which makes them easier to read). Signed-off-by: Alexey Neyman <stilor@att.net>
218 lines
6.1 KiB
Diff
218 lines
6.1 KiB
Diff
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]
|